ios - 展开后 swift subview 不更新

标签 ios iphone swift cocoa-touch uiviewcontroller

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

相关文章:

android - flutter : How to launch the Google Map app with "directions" to a predefined location?

ios - 解析 XML 数据 objective-c

ios - 键盘打开时如何滚动屏幕?

iPhone 实时数据流

ios - Firebase Swift - 如何创建一个 child 并将其 id 添加到另一个 ref 属性?

iphone - 保存数据后 UITableView 没有重新加载

iphone - 在 uitextview 中的文本周围制作气泡?

ios - 收到 NSNotification 后执行选择器会调用我的 View Controller 的 deinit

ios - 如何在 iOS swift 中自动登录用户?

ios - 移除导航栏和工具栏的边框