Ios 应用程序在ViewWillEnglishe()上随机崩溃
我是Swift新手,在我的应用程序中发现一些奇怪的崩溃 Fabric报告称,ViewWillEnglishe()中发生了崩溃 我有两个viewcontroller。用户点击viewcontroller中的按钮,然后他们移动到B viewcontroller输入内容,他们返回,A从B获取信息 我使用代理完成此任务 B: A: 崩溃是随机发生的,我已经在我的设备上进行了测试,但什么也没发生。但其他人说他们可能会重复这种崩溃Ios 应用程序在ViewWillEnglishe()上随机崩溃,ios,swift,Ios,Swift,我是Swift新手,在我的应用程序中发现一些奇怪的崩溃 Fabric报告称,ViewWillEnglishe()中发生了崩溃 我有两个viewcontroller。用户点击viewcontroller中的按钮,然后他们移动到B viewcontroller输入内容,他们返回,A从B获取信息 我使用代理完成此任务 B: A: 崩溃是随机发生的,我已经在我的设备上进行了测试,但什么也没发生。但其他人说他们可能会重复这种崩溃 我想知道我是否正确使用了委托,还是因为其他原因造成的。您可能在视图中遇到问题
我想知道我是否正确使用了委托,还是因为其他原因造成的。您可能在视图中遇到问题。如果视图消失,则在强制展开时有许多选项可能会给您带来麻烦 最好是防撞安全:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if let lessonName = (tableView.cellForRow(at: IndexPath(row: 0, section: 0))?.viewWithTag(1) as? UITextField)?.text {
delegate?.changeLessonNameTag(name: lessonName, tag: tagColor)
}
}
您可能在视图中遇到了问题。当您强制展开时,视图中有许多选项可能会给您带来麻烦 最好是防撞安全:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if let lessonName = (tableView.cellForRow(at: IndexPath(row: 0, section: 0))?.viewWithTag(1) as? UITextField)?.text {
delegate?.changeLessonNameTag(name: lessonName, tag: tagColor)
}
}
我的直觉反应是,你要强制展开的对象之一实际上是
nil
func changeLessonNameTag(name:String,tag:UIColor){
self.lesson?.lessonName = name
self.lesson?.lessonTagColor = tag
tableView.reloadData()
}
而不是使用强制展开它代码>,您应该安全地打开它,如果它不存在,则会优雅地失败:
func changeLesson(name: String, tag: UIColor) { //Updated formatting and method declaration to fit with current Swift standards
guard let lesson = lesson else { //Don't need to reference self here
return
}
lesson.lessonName = name
lesson.lessonTagColor = tag
tableView.reloadData()
}
请参阅@orxelm的答案,了解如何安全地在B中展开文本值
在使用时,请始终保持非常的警惕代码>操作员。即使你认为你可以保证物体永远不会为零。我的直觉反应是,你正在强制展开的物体中有一个实际上是nil
func changeLessonNameTag(name:String,tag:UIColor){
self.lesson?.lessonName = name
self.lesson?.lessonTagColor = tag
tableView.reloadData()
}
而不是使用强制展开它代码>,您应该安全地打开它,如果它不存在,则会优雅地失败:
func changeLesson(name: String, tag: UIColor) { //Updated formatting and method declaration to fit with current Swift standards
guard let lesson = lesson else { //Don't need to reference self here
return
}
lesson.lessonName = name
lesson.lessonTagColor = tag
tableView.reloadData()
}
请参阅@orxelm的答案,了解如何安全地在B中展开文本值
在使用时,请始终保持非常的警惕代码>操作员。即使您认为可以保证对象永远不会为零。如果调用viewwilldiscover
时IndexPath{0,0}
不可见,那么此行将设置lessonName=nil
,因为该行没有单元格。这将导致以下线路崩溃
lessonName = tableView.cellForRow(at: IndexPath(row: 0, section: 0))?.viewWithTag(1) as! UITextField ).text!
正如其他人所提到的,有太多的强制展开
但是,除非该单元格是由用户动态填充的,否则您应该能够从UITableViewDataSource
中获得相同的值-因此,如果该单元格可见或不可见,它将起作用
此外,不要在代理方法中强制展开课程
——可能是nil
func changeLessonNameTag(name:String,tag:UIColor){
self.lesson?.lessonName = name
self.lesson?.lessonTagColor = tag
tableView.reloadData()
}
如果调用viewwilldemouse
时IndexPath{0,0}
不可见,则此行将设置lessonName=nil
,因为该行没有单元格。这将导致以下线路崩溃
lessonName = tableView.cellForRow(at: IndexPath(row: 0, section: 0))?.viewWithTag(1) as! UITextField ).text!
正如其他人所提到的,有太多的强制展开
但是,除非该单元格是由用户动态填充的,否则您应该能够从UITableViewDataSource
中获得相同的值-因此,如果该单元格可见或不可见,它将起作用
此外,不要在代理方法中强制展开课程
——可能是nil
func changeLessonNameTag(name:String,tag:UIColor){
self.lesson?.lessonName = name
self.lesson?.lessonTagColor = tag
tableView.reloadData()
}
你能发布你的坠机报告吗?代码中有三个感叹号:as代码>,文本代码>,课程代码>。它们都是“撞车我”的意思。你能发布你的撞车报告吗?代码中有三个感叹号:as代码>,文本代码>,课程代码>。他们每个人的意思都是“撞死我”