我正在使用 swift 编写一个基本的 iOS 日历应用程序。目前,我的主视图包含一个 subview ——“月 View ”——其中包含五个“周 View ”,每个 View 包含 7 个“日 View ”。主视图 Controller 被设置为每一天 subview 的委托(delegate),每个 subview 都可以被触摸以触发一个新的“日 View Controller ”的连接,它加载了所选日期的所有信息。日 View Controller 在顶部导航栏上还有一个按钮“完成”按钮,可触发返回主视图 Controller 的展开转场。
问题是:在 unwind segue 之后,day view controller 中“day”的数据被成功传递回主 view controller(我从调试我的数据模型中知道这一点),但是 main 的 View View Controller 将不会更新以正确显示更新日期的信息。
我已经尝试在我的主要“月 View ”以及每个单独的“日 View ”上从 segue 以及从“viewWillAppear”和“viewDidAppear”调用“setNeedsDisplay”和“setNeedsLayout”,但没有任何更新。我也尝试删除和添加每个单独的日期 subview (只是为了让事情发生)但这会导致新的一天与正确的信息叠加在旧的一天上。我到处寻找解决方案。我相信我可能只是缺少某个快速设计原则。非常感谢您!
这里是segue的代码:
@IBAction func unwindToCalendar(sender: UIStoryboardSegue) {
if let sourceViewController = sender.sourceViewController as? dayUIViewController {
var tag = sourceViewController.tag
let dayOfWeek = tag%10
tag=tag/10
let weekOfMonth = tag%10
monthView.weekList[weekOfMonth].dayList[dayOfWeek] = sourceViewController.day
//monthView.weekList[weekOfMonth].dayList[dayOfWeek].updateLabel()
monthView.weekList[weekOfMonth].dayList[dayOfWeek].setNeedsDisplay()
}
}
更新: 更新日 subview 的相关属性会产生我想要的效果(即,当我转换回日历 View 时,所选日期反射(reflect)了我从日 View Controller 所做的更改)。
所以替换这个:
monthView.weekList[weekOfMonth].dayList[dayOfWeek] = sourceViewController.day
用这个:
monthView.weekList[weekOfMonth].dayList[dayOfWeek].dayOfMonth = sourceViewController.day.dayOfMonth
monthView.weekList[weekOfMonth].dayList[dayOfWeek].updateLabel()
给出所需的“视觉”结果。但为什么用新的日 View 替换整个日 View 也达不到这个结果呢?
最佳答案
问题出在“日数据”和 View 本身存在于两个不同的地方,而我忽略了这一点。在我的原始代码中,我用新的“日 View ”替换了相关的数组条目,但日历 View 中的相关 subview 仍然是旧的“日 View ”。我需要用 segue 中的新“日 View ”替换日历中的日 subview :
//make life easier with a variable
let thisWeek = monthView.weekList[weekOfMonth]
//remove the old subview from the calendar
thisWeek.dayList[dayOfWeek].removeFromSuperview()
//replace the old day with the new day in the data
thisWeek.dayList[dayOfWeek] = sourceViewController.day
//add the new day as a subview to its "week parent view"
thisWeek.addSubview(thisWeek.dayList[dayOfWeek])
//nicely layout the new day subviews
thisWeek.layoutSubviews()
虽然我已经解决了这个特殊问题,但我仍然欢迎对设计原则提出意见,因为我对 swift 和 MVC 设计还很陌生。谢谢!
关于ios - 展开后 swift subview 不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36002012/