2016-04-16 7 views
2

私は長い時間を把握しようとしています。誰かが私の代理メソッドが呼び出されない理由を教えてもらえますか?そのtvOSプロジェクトですが、私は単純なiOSアプリケーションとして動作するはずです。ボタンをクリックすると、ポップアップ・テーブル・ビューが表示され、選択時に、選択されたオプションでボタン・ラベルを更新しようとしています。代理人はnil tvOSを返します

protocol PopupSelectionHandlerProtocol{ 
    func UpdateSelected(data:String) 
} 

class PopupViewController: UIViewController, UITableViewDataSource,UITableViewDelegate { 

    @IBOutlet weak var myTable: UITableView! 

    let months = [1,2,3,4,5,6,7,8,9,10,11,12] 
    let days = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31] 
    let yearsRange = [2015,2016,2017,2018,2019,2020] 
    var popupType:String! 
    var delegate:PopupSelectionHandlerProtocol? 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     popupType = "months" 
    } 


    func numberOfSectionsInTableView(tableView: UITableView) -> Int { 

     return 1 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     if (popupType == "months"){ 
      return 12 
     }else if (popupType == "days"){ 
      return 31 
     }else if (popupType == "years") 
     { 
      return 6 
     } 
     return 10 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) 

     cell.textLabel?.text = String(months[indexPath.row]) 
     return cell 

    } 
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     print(tableView.cellForRowAtIndexPath(indexPath)?.textLabel?.text) 
     delegate?.UpdateSelected((tableView.cellForRowAtIndexPath(indexPath)?.textLabel?.text)!) 
     self.dismissViewControllerAnimated(true, completion: nil) 
    } 


} 

そしてこの -

class VacationPlannerController: UIViewController,PopupSelectionHandlerProtocol { 

    @IBOutlet weak var fromMonth: UIButton! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     let popupDelegate = PopupViewController() 
     popupDelegate.delegate = self 
    } 

    func UpdateSelected(data:String){ 
     print("Inside UpdateSelected VacationPlannerController \(data)") 
     fromMonth.titleLabel?.text = data 
    } 

} 
+0

はあなたのtableViewからのViewControllerにはCtrl +ドラッグまたは右クリックホールド+ドラッグでストーリーボードにデリゲートを設定することがありますか? –

+0

はい私はそれをしました –

+0

どのメソッドを委譲してもupdateSelectedまたはtableViewのデリゲートメソッドが呼び出されていませんか? –

答えて

0

2つのこと - didSelectRowAtIndexPathでPopupViewController- で

まず、

のviewDidLoadからのコードの下に削除
self.delegate?.UpdateSelected((tableView.cellForRowAtIndexPath(indexPath)?.textLabel?.text)!) 

そしてVacationPlannerController- でセカンドで

delegate?.UpdateSelected((tableView.cellForRowAtIndexPath(indexPath)?.textLabel?.text)!) 

を置き換えます -

let popupDelegate = PopupViewController() 
    popupDelegate.delegate = self 

そしてprepareForSegueを追加 -

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

     let destinationVC = segue.destinationViewController as! PopupViewController 
     destinationVC.delegate = self 
    } 

そして問題解決yeeee :)

1

問題が提示一度に一つだけのViewControllerができるので、あなたがnilとしてデリゲートを取得している、ということです。あなたのpopupViewControllerのビューがロードされていないので。 viewDidLoad()メソッドが呼び出されないため、popupDelegateが設定されません。

無効であることを確認する場合は、あなたのdidSelectでこれを試してください...方法

fromMonthボタンを更新したい場合。最初に、viewDidLoad()を呼び出すためにVacationPlannerControllerを表示/プッシュする必要があります。その後、そのプロパティ、つまりfromMonthラベルを更新することができます。この問題を解決するために

+0

popupViewControllerのポップアップは、VacationPlannerControllerにナビゲートする必要はありません。私はvacationplannerにprepareForSegueを追加しました。 –

+0

@RichaSrivastava Ohk良い、thats何が必要なのですか!しかし、あなたが解決策をあなたが提示したものの、他の人も問題を理解できるように、あなたが問題を見つけるのを助けたならば、答えをアップアップしてください。 –

関連する問題