2017-03-24 3 views
0

私はUITableViewポップオーバーをカスタムセルで表示しようとしていますが、セルのUILabelアウトレットは常にnilです。ストーリーボードを使用してポップオーバーテーブルビューとカスタムセルを作成しました。すべてが正しく接続されているように見えます。カスタムセルには「セル」という識別子があります。 popoverは正しく表示されます。カスタムセルのラベルは、nilなので設定されません。カスタムセルを持つUITableViewポップオーバーはセル属性で常に失敗する

私は、アップルメソッド(下記のbuttonPressed関数を参照)とUITableViewCell's attributes are nil when instantiating UITableView as a popoverで提案されているsegueメソッドを使用してポップオーバーを提示しようとしましたが、どちらも問題は解決しませんでした。

私のカスタムUITableViewCellクラスには、2つの接続ラベルと1つの未接続intがあります。すべてのストーリーボードの接続は有効なようです:

class PopoverTableCell : UITableViewCell { 
    @IBOutlet var label1: UILabel! // <== connected in storyboard 
    @IBOutlet var label2: UILabel! // <== connected in storyboard 

    var int3 : Int? = nil 
} 

は、ここで私は(ボタンプッシュ経由)ビューコントローラから(Appleのメソッド)を提示方法は次のとおりです。

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    @IBAction func buttonPressed(_ sender: UIButton) { 
     let popoverController = PopoverController() 
     popoverController.modalPresentationStyle = UIModalPresentationStyle.popover 
     popoverController.preferredContentSize = CGSize(width: 200, height: 300) 

     present(popoverController, animated: true, completion: nil) 

     let popoverPresentationController = popoverController.popoverPresentationController 
     popoverPresentationController?.sourceView = sender 
     popoverPresentationController?.sourceRect = CGRect(x: 0, y: 0, width: sender.frame.size.width, height: sender.frame.size.height) 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

} 

私がしようとすると、成功したポップオーバーが表示されますが、そのセルにラベルを設定すると、ラベルが常にnilであるために失敗します。

class PopoverController : UITableViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // it makes no difference if I set these or not - storyboard does it for me 
     self.tableView.delegate = self 
     self.tableView.dataSource = self 

     // if I don't register, the cell fails to deque 
     self.tableView.register(PopoverTableCell.self, forCellReuseIdentifier: "Cell") 
    } 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! PopoverTableCell 
     cell.backgroundColor = UIColor.yellow 
     cell.label1?.text = "Label 1111" 
     cell.label2?.text = "Label 2222" 
     cell.int3 = 5555 
     print("label1: \(cell.label1)")  // <== always nil 
     print("label2: \(cell.label2)")  // <== always nil 
     print("label3: \(cell.int3)")  // <== always Optional(5555) which is correct 
     return cell 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return 4 
    } 

} 

私はcellForRowAt基金のreturn文にブレークポイントを入れて、私は、デバッガでこれを取得する:

Debugger Imageどんなに私は何をすべきか

、LABEL1とLABEL2コンセントは常にゼロint3(コンセントではない)はうまく動作しているようです。

+0

ストーリーボードのシーンのプロトタイプセルはありますか?ストーリーボード内のセルの識別子を設定し、コード内にセルを登録する必要はありません。ストーリーボードで作成したコードにセルを登録することはできません。 – dan

答えて

0

私はこのコメントに記載されている問題だと思う:

// if I don't register, the cell fails to deque 

をし、nilの出口が同じ問題の症状です。

ストーリーボードにアウトレットを作成した場合、PopoverController()を使用してビューコントローラーを作成するときに使用しているデフォルトのinit()メソッドによって、アウトレットが正しく初期化されません。

view controller with storyboard idそして、このようにそれをインスタンス化します:

は、ストーリーボードにあなたのビューコントローラに識別子を与えて試してみてください。この場合

let popoverController = storyboard?.instantiateViewController(withIdentifier: "MyViewController") as! PopoverController 

、細胞は(絵コンテから引く必要があります正確には、init()ではなくinit?(coder aDecoder: NSCoder)メソッドを実行するので、コンセントはゼロになりません。このようにView Controllerをインスタンス化する場合は、セルを登録する必要もありません。

0

ストーリーボードにセルを作成したため、セルを登録する必要はありません。私はまた、エラーを説明したいと思います:エラーIntは正常に動作していますが、UILabelはありません。その理由は、UILabel(任意のビュー)がロードされていないからです。

+0

ありがとうございますが、なぜUILabelsはロードされていませんか? – Drew

関連する問題