我正在使用swift编写一个基本的iOS日历应用程序。目前,我的主视图包含一个子视图 - "月视图" - 包含五周"周视图"每个都包含7天的视图。"主视图控制器被设置为每个子视图的委托,每个子视图都可以被触摸以触发到新的日视图控制器的#seg;它会加载所选日期的所有信息。日视图控制器也有一个按钮"完成"顶部导航栏上的按钮,触发展开segue返回主视图控制器。
问题是:在解开segue之后,来自" day"在日视图控制器成功传递回主视图控制器(我从调试我的数据模型知道这一点),但主视图控制器的视图将不会更新以正确显示更新日的信息。
我试过调用" setNeedsDisplay"和" setNeedsLayout"来自segue和来自" viewWillAppear"和" viewDidAppear"在我的主要"月视图"以及每个人的日间视图"但没有更新。我也尝试删除并添加每个单独的日子视图(只是为了让事情发生)但这会导致新的一天与正确的信息叠加在旧的一天。我已经搜遍了所有解决方案。我相信我可能只是错过了某种快速的设计原则。非常感谢你提前!
以下是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()
}
}
更新 更新日期子视图的相关属性可以获得所需的效果(即,当我转换回日历视图时,所选日期反映了我从日视图控制器所做的更改)。
所以取而代之:
monthView.weekList[weekOfMonth].dayList[dayOfWeek] = sourceViewController.day
用这个:
monthView.weekList[weekOfMonth].dayList[dayOfWeek].dayOfMonth = sourceViewController.day.dayOfMonth
monthView.weekList[weekOfMonth].dayList[dayOfWeek].updateLabel()
提供所需的"视觉效果"结果。但为什么用新的日视图替换整天视图也不能达到这个效果呢?
答案 0 :(得分:0)
问题来自于“日数据”和视图本身存在于两个不同的地方,我忽略了这一点。在我的原始代码中,我用新的“日视图”替换了相关的数组条目,但日历视图中的相关子视图仍然是旧的“日视图”。我需要用segue中的新“日视图”替换日历中的日子视图:
//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设计还是比较陌生的。谢谢!