自定义UITableViewCell中UIDatePicker无法显示且报nil错误
问题原因与解决方案
嘿,这个问题我太熟悉了——你踩了一个新手很容易犯的坑:同时混用了Storyboard原型Cell和代码注册Cell,导致TableView加载不到你在Storyboard里配置好带UIDatePicker的Cell,自然就会出现startDatePicker为nil的崩溃。
具体原因
当你在Storyboard里已经创建了原型Cell,并且设置了它的类为startDateCell、复用标识符为startDateCell时,Storyboard会自动帮你完成Cell的注册工作。但你又在viewDidLoad里手动调用了:
self.timeTableView.register(startDateCell.self, forCellReuseIdentifier: "startDateCell")
这行代码会直接覆盖Storyboard的配置,让TableView跳过Storyboard布局,用代码初始化一个空的startDateCell实例——这个实例没有加载你在Storyboard里拖入的UIDatePicker,所以你的startDatePickerIBOutlet根本没有被关联,自然就是nil。
修复步骤
移除代码里的注册语句
删掉viewDidLoad中的self.timeTableView.register(...)这一行,让TableView从Storyboard加载你配置好的原型Cell。再次确认Storyboard配置
- 选中原型Cell,在Identity Inspector里确认Class是
startDateCell,且Module选择正确(一般是你的项目名)。 - 在Attributes Inspector里确认复用标识符
Identifier是startDateCell,和你代码里使用的完全一致。 - 右键
startDateCell类文件,检查startDatePicker的IBOutlet是否正确连接到Storyboard里的UIDatePicker(连线应该是蓝色的,没有断开)。
- 选中原型Cell,在Identity Inspector里确认Class是
修改后的viewDidLoad代码
override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. self.eventText.delegate = self self.scrollView.delegate = self self.timeTableView.delegate = self self.timeTableView.dataSource = self // 删掉下面这行冲突的注册代码 // self.timeTableView.register(startDateCell.self, forCellReuseIdentifier: "startDateCell") }
额外检查点
- 确保你的
timeTableViewIBOutlet已经正确连接到Storyboard里的UITableView,没有断开。 - 检查UIDatePicker在Cell里的约束是否正确,有没有被意外设置为隐藏(Hidden属性不要勾选)。
这样修改后,TableView就能正确加载你在Storyboard里配置好的带DatePicker的Cell,startDatePicker就不会是nil了。
内容的提问来源于stack exchange,提问作者user3431800
相关产品推荐
相关产品推荐

