我是Swift的新手,我在我的应用程序中发现了一些奇怪的崩溃。
Fabric报告称在viewWillDisappear()中发生了崩溃。
我在Viewcontroller中有两个ViewControllers.User点击按钮,然后他们移动到B viewcontroller输入内容,用户返回,A从B获取信息。
我使用委托完成此任务。
B:
class LessonNameTagTableViewController: UITableViewController {
...
var delegate:PassingData?
override func viewWillDisappear(_ animated: Bool) {
lessonName = (tableView.cellForRow(at: IndexPath(row: 0, section: 0))?.viewWithTag(1) as! UITextField ).text!
delegate?.changeLessonNameTag(name: lessonName, tag: tagColor)
super.viewWillDisappear(animated)
}
...
}
A:
class LessonEditTableViewController: UITableViewController,PassingData {
var lesson :Lesson?
...
func changeLessonNameTag(name:String,tag:UIColor){
self.lesson!.lessonName = name
self.lesson!.lessonTagColor = tag
tableView.reloadData()
}
...
}
崩溃是随机发生的,我在我的设备上测试过,没有发生任何事情。但是其他人说他们可以重复这次崩溃。
我想知道我是否正确使用代表,或者是由于其他原因造成的。
答案 0 :(得分:1)
你可能在viewWillDisappear中遇到问题,那里有很多选项,当你强制解包时会给你带来麻烦。
安全可靠性更好:
$('#chat_grab').load('chat_grab.php', callback);
function callback() {
$('#chat_grab').scrollTop(0);
}
答案 1 :(得分:1)
如果IndexPath{0,0}
在调用viewWillDisappear
时不可见,则此行将设置lessonName = nil
,因为该行没有单元格。这将导致以下行崩溃。
lessonName = tableView.cellForRow(at: IndexPath(row: 0, section: 0))?.viewWithTag(1) as! UITextField ).text!
正如其他人所提到的,有太多的强迫解开。
但是,除非用户动态填充该单元格,否则您应该能够从UITableViewDataSource
获得相同的值 - 因此如果单元格可见,它将起作用。
此外,不要强行在代理方法中解包lesson
- 可以是nil
。
func changeLessonNameTag(name:String,tag:UIColor){
self.lesson?.lessonName = name
self.lesson?.lessonTagColor = tag
tableView.reloadData()
}
答案 2 :(得分:0)
我的直觉反应是,你强行展开的对象之一实际上是nil
。
使用!
而不是强行展开它,你应该安全地展开它,如果它不存在则优雅地失败:
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
中安全地展开文本值使用!
运算符时始终非常警惕。即使你认为你可以保证对象永远不会是零。