2016-04-15 18 views
0

異なるデリゲート/データソースを持つ2つの異なるUIPickerViewを作成する方法を教えてください。私は2つのセルを持つTableViewを持って、私はUIPickerViewと2つの異なるUIAlertControllerを開く必要があります。私のコード:異なるUIPickerViewデリゲート/データソースUIAlertController

private weak var filterController: UIAlertController! { 

    let controllerConfig = UIAlertController(title: "", message: "\n\n\n\n\n\n\n\n\n", preferredStyle: .Alert) 

    controllerConfig.modalInPopover = true 

    //Create UIPickerView 
    let pickerFrame = CGRectMake(0, 20, 270, 180) 
    let picker = UIPickerView(frame: pickerFrame) 
    //Picker Color 
    picker.backgroundColor = controllerConfig.view.backgroundColor 

    //Picker Delegate/DataSource 
    picker.delegate = self 
    picker.dataSource = self 

    //Add Picker 
    controllerConfig.view.addSubview(picker) 

    //Create header frame 
    let headerFrame = CGRectMake(0, 5, 270, 45) 
    let headerView = UIView(frame: headerFrame) 
    headerView.backgroundColor = controllerConfig.view.backgroundColor 

    //Create 'Close' button 
    var closeButton: UIButton! { 
     let buttonFrame = CGRectMake(230, 5, 35, 35) 
     let buttonConfig = UIButton(frame: buttonFrame) 
     buttonConfig.setTitle("X", forState: .Normal) 
     //Set color on text 
     buttonConfig.setTitleColor(UIColor.grayColor(), forState: .Normal) 
     buttonConfig.setTitleColor(erablagoThemeColor, forState: .Highlighted) 
     buttonConfig.addTarget(self, action: #selector(didClickOnCloseButton), forControlEvents: .TouchUpInside) 

     return buttonConfig 
    } 

    let showAction = UIAlertAction(title: "Select", style: .Default) { (action) in 
     //TODO 
    } 

    //Add subview 
    headerView.addSubview(closeButton) 
    controllerConfig.addAction(showAction) 
    controllerConfig.view.addSubview(headerView) 

    return controllerConfig 
} 

///Close current view 
func didClickOnCloseButton() { 
    dismissViewControllerAnimated(true, completion: nil) 
} 

そして私は実装UIPickerViewDelegateとUIPickerViewDataSourceを持っています。 ViewContrillerでこの実装を変更する必要があります。

//MARK: - UIPickerViewDataSource 
extension FilterController: UIPickerViewDataSource { 
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { 
    return 1 
} 

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
    return 2 
} 

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
    switch row { 
    case 0: 
     return "All" 
    case 1: 
     return "Cars and Bicycles" 
    default: 
     return nil 
    } 
} 

}

私はUIAlertControllerでクラスを作成し、私のViewControllerで彼を呼び出す必要があることができますか?知りません。ありがとうございます:

+0

フム、私は新しいデリゲートクラスを作成することができます。それは私を助けるかもしれない。 –

答えて

0

[OK]を、私はUIPickerDelegate/DataSourceを使って新しいクラスを作って、新しい製このクラスをインスタンス化します。私のコードは以下のようになります。

Delegateクラス:

class SortFilterPicker: NSObject, UIPickerViewDelegate, UIPickerViewDataSource { 

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { 
     return 1 
    } 

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
     return 4 
    } 

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
     switch row { 
     case 0: 
      return "1-1" 
     case 1: 
      return "2-2" 
     case 2: 
      return "3-3" 
     case 3: 
      return "4-4" 
     default: 
      return nil 
     } 
    } 
} 

そしてメインコード:

private let categoryFilter = FilterPicker() 

private weak var filterController: UIAlertController! { 

    var heightPopUp = "\n" 
    let controllerConfig = UIAlertController(title: "", message: heightPopUp.repeatOf(9), preferredStyle: .Alert) 

    controllerConfig.modalInPopover = true 
    let pickerFrame = CGRectMake(0, 20, 270, 180) 
    let picker = UIPickerView(frame: pickerFrame) 

    picker.delegate = categoryFilter 
    picker.dataSource = categoryFilter 

    picker.backgroundColor = controllerConfig.view.backgroundColor 
    controllerConfig.view.addSubview(picker) 

    let headerFrame = CGRectMake(0, 5, 270, 45) 
    let headerView = UIView(frame: headerFrame) 
    headerView.backgroundColor = controllerConfig.view.backgroundColor 

    var closeButton: UIButton! { 
     let buttonFrame = CGRectMake(230, 5, 35, 35) 
     let buttonConfig = UIButton(frame: buttonFrame) 
     buttonConfig.setTitle("X", forState: .Normal) 
     //Set color on text 
     buttonConfig.setTitleColor(UIColor.grayColor(), forState: .Normal) 
     buttonConfig.setTitleColor(erablagoThemeColor, forState: .Highlighted) 
     buttonConfig.addTarget(self, action: #selector(didClickOnCloseButton), forControlEvents: .TouchUpInside) 

     return buttonConfig 
    } 

    let showAction = UIAlertAction(title: "Ok", style: .Default) { (action) in 
     //TODO: Make show 
    } 

    headerView.addSubview(closeButton) 
    controllerConfig.addAction(showAction) 
    controllerConfig.view.addSubview(headerView) 

    return controllerConfig 
} 

それの作品:]

0

あなたがピッカーに異なるデリゲートを持たせたいとお考えの場合は、デリゲートメソッドを処理するクラスが異なることをお勧めします。したがって、あなたの問題は次のように解決されます:

picker.delegate = self 
picker2.delegate = anotherClassInstance 

しかし、私はあなたが求めているものとは思えません。私はあなたが同じクラスによって処理される異なるデータを持つ2つの異なるピッカーを持つ方法を尋ねていると思うので、同じデリゲートクラスを共有します。 、そして、

picker.delegate = self 
picker.tag = 1 
picker2.delegate = self 
picker2.tag = 2 

ようにそれらの間の区別:これを行う最も簡単な方法は、各ピッカー上のタグのプロパティを割り当てることである

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
    if picker.tag == 1 { 
      switch row { 
     case 0: 
      return "All" 
     case 1: 
      return "Cars and Bicycles" 
     default: 
      return nil 
    } else { 

     switch row { 
     case 0: 
      return "None" 
     case 1: 
      return "Other picker data" 
     default: 
      return nil 
    } 
} 
+0

ありがとうございます!私はこれを使用しようとします、後で私はあなたがそれを動作させるかどうかを伝えます:) –

関連する問題