在我的UIViewController
我有2 UITextFields
A和B.
A以编程方式将inputView
设置为UIDatePicker
。
B将其inputView
以编程方式设置为UIPickerView
,我已定义dataSource
和delegate
。
当A的选择器中的值发生变化时,我附加了一个选择器,用于更新A中的文本。
当B的选择器中的值发生变化时,我会将NSNotification
类的dataSource, delegate
发送到UIViewController
。 TextField B基本上允许用户将n 年数添加到A中的日期。请注意,此时B的选择器仍然可见。
到目前为止一切顺利。
现在,当我在NSNotification
收到UIViewController
时,我的notificationReceived
选择器方法从B获取输入,进行一些计算,并更新选择器和A中的文本。代码的相关部分如下所示:
class MyViewController: UIViewController {
@IBOutlet weak var textFieldA: UITextField!
@IBOutlet weak var textFieldB: UITextField!
let datePickerA = UIDatePicker()
let pickerB = UIPickerView()
override func viewDidLoad() {
super.viewDidLoad()
// init A
datePickerA.datePickerMode = UIDatePickerMode.DateAndTime
picker.addTarget(self, action: #selector(datePickerAChanged(_:)), forControlEvents: UIControlEvents.ValueChanged)
textFieldA.inputView = datePickerA
// init B
pickerB.dataSource = bDataSource //bDataSource is the datasource and delegate class instance
pickerB.delegate = bDataSource
textFieldB.inputView = pickerB
}
func notificationReceived(notification: NSNotification) {
switch notification.name {
case foo:
// do calculations and get the updated date
let nsdate = calculateNewDate()
self.datePickerA.setDate(nsdate, animated: false)
self.textFieldA.text = newDateString()
default:
break;
}
}
}
当我第一次突出显示B,选择一个值,然后突出显示A时,这种安排工作正常。但是当我首先突出显示A,然后突出显示B并在B中选择一个值,然后再次点击A,然后我的应用程序崩溃有错误:
我的应用[] *断言失败 - [UIPickerTableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:],/ BuildRoot / Library / People / com.apple.xbs / Source / UIKit_Sim / UIKit-3512.60.7 / UITableView.m:10594
我的应用程序[] *因未捕获的异常而终止应用程序 'NSInternalInconsistencyException',原因:'UITableView dataSource是 没有设置'
如果我评论self.datePickerA.setDate(nsdate, animated: false)
,那么它不会崩溃。我检查nsdate,以便它不是零或无效,所以这不是问题。
这里没有任何变量超出范围,我最终在试图理解为什么会崩溃。救命!
更新:我已在此处上传了项目文件:https://github.com/urbanmachinist/DatePickerCrash/tree/master 自述文件显示了重现错误的步骤。