【发布时间】:2017-03-24 16:32:55
【问题描述】:
我正在尝试使用自定义单元格呈现 UITableView 弹出框,但我的单元格中的 UILabel 插座始终为零。我使用情节提要来创建弹出表视图和自定义单元格。一切似乎都正确连接,我的自定义单元格具有“单元格”标识符。弹出框显示正确,只是自定义单元格中的标签不会设置,因为它们是 nil。
我尝试使用 Apple 方法(请参阅下面的 buttonPressed 函数)和 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.
}
}
这成功地打开了弹出框,但是当我尝试在单元格中设置标签时,它失败了,因为标签始终为零。
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(不是出口)似乎工作得很好。
【问题讨论】:
-
这些原型单元格是否在情节提要的场景中?您需要在情节提要中设置单元格的标识符,而不是在代码中注册单元格。您无法在情节提要中创建的代码中注册单元格。
标签: ios swift3 uipopovercontroller custom-cell