具有自定义单元格的UITableView弹出窗口失败,单元格属性始终为零

时间:2017-03-24 16:32:55

标签: ios swift3 uipopovercontroller custom-cell

我试图用自定义单元格呈现UITableView popover,但我单元格中的UILabel出口总是为零。我使用故事板创建popover tableview和自定义单元格。一切似乎连接正确,我的自定义单元格有" Cell"标识符。弹出窗口显示正确,只是自定义单元格中的标签不会设置,因为它们是零。

我尝试使用Apple方法呈现popover(请参阅下面的buttonPressed func)和UITableViewCell's attributes are nil when instantiating UITableView as a popover中建议的segue方法,但都没有解决我的问题。

我的自定义UITableViewCell类有两个连接的标签和一个未连接的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.
   }

}

成功调出popover但是当我尝试在单元格中设置标签时,它会失败,因为标签总是为零。

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(不是出口)似乎工作正常。

2 个答案:

答案 0 :(得分:0)

您无需注册单元格,因为您在故事板中创建了单元格。我还想解释错误:错误Int工作正常但UILabel为零,原因是UILabel(任何视图)都没有加载。

答案 1 :(得分:0)

我认为此评论中描述的问题是:

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

和零出口是同一问题的症状。

如果您在故事板中创建插座,则无法通过默认的init()方法正确初始化,这是您在使用PopoverController()创建视图控制器时所使用的方法。

尝试在故事板中为视图控制器提供标识符:

view controller with storyboard id

然后像这样实例化它:

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

在这种情况下,单元格应该从故事板中拉出(确切地说,它通过init?(coder aDecoder: NSCoder)方法而不是init()),因此它们的出口不会是零。如果以这种方式实例化视图控制器,则也不需要注册单元格。