我试图用自定义单元格呈现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语句上放了一个断点,我在调试器中得到了这个:
无论我做什么,label1和label2出口总是零,但int3(不是出口)似乎工作正常。
答案 0 :(得分:0)
您无需注册单元格,因为您在故事板中创建了单元格。我还想解释错误:错误Int工作正常但UILabel为零,原因是UILabel(任何视图)都没有加载。
答案 1 :(得分:0)
我认为此评论中描述的问题是:
// if I don't register, the cell fails to deque
和零出口是同一问题的症状。
如果您在故事板中创建插座,则无法通过默认的init()
方法正确初始化,这是您在使用PopoverController()
创建视图控制器时所使用的方法。
尝试在故事板中为视图控制器提供标识符:
然后像这样实例化它:
let popoverController = storyboard?.instantiateViewController(withIdentifier: "MyViewController") as! PopoverController
在这种情况下,单元格应该从故事板中拉出(确切地说,它通过init?(coder aDecoder: NSCoder)
方法而不是init()
),因此它们的出口不会是零。如果以这种方式实例化视图控制器,则也不需要注册单元格。