放松segue后swift子视图不会更新

时间:2016-03-15 03:11:26

标签: ios iphone swift cocoa-touch uiviewcontroller

我正在使用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()

提供所需的"视觉效果"结果。但为什么用新的日视图替换整天视图也不能达到这个效果呢?

1 个答案:

答案 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设计还是比较陌生的。谢谢!