【发布时间】:2015-09-17 03:40:15
【问题描述】:
我感觉我知道这个问题的答案,但想确认一下我的想法。
如果我错了,指针真的很有帮助,因为我一直在弄乱代码,以及过去几个小时在网上搜索。
我有一个 NSTimer 在设定的时间范围内通过委托更新多个视图。
我认为在 iPad 和 iPhone 6 Plus 上将视图放入拆分视图中会很好看。我成功地将我的视图移动到一个拆分视图控制器中,但是当我旋转设备时,只有一侧通过委托更新(主更新或细节更新)取决于我在旋转设备时在应用程序中的位置。当设备处于“拆分视图模式”时,该侧继续更新。如果我单击 master 中的新行并且 master 正在更新(详细信息没有),则详细信息开始更新并且 master 停止。
我的猜测是,因为委托在主队列上触发以更新视图(据我所知,这是更新视图的唯一方法)它只是更新当前设置为活动的视图(IE 主如果我在查看成为详细视图的内容时旋转,即使它是可见的也不在主队列上)。是这样吗?您不能同时在拆分视图的两侧触发更新吗?
我再次寻找更多可能吗?我的应用程序按预期工作,我只是想通过添加拆分视图使其更通用并更好地使用房地产。如果我不能同时更新拆分视图的两侧,我将重新考虑我要走的路径。
编辑: 感谢您的回答。为了澄清我在做什么,我将添加一些代码:
protocol MasterTimerDelegate {
func masterTimerDidUpdate(item: Item, forGroup group: Group)
func masterTimerDidUpdateAllItems()
func masterTimerDidUpdateProgressForItem(item: Item, forGroup group: Group, withProgressCompleted progress: Double)
}
那么无论是在 MasterView 区域还是 DetailView 区域中的两个 ViewController 都在实现那个 Delegate
MasterTimer 类现在每 1 秒触发一次 NSTimer 进行测试,我正在让它更新标签和其他各种组件。
这是我在 splitView 的 DetailSide 上的代码示例。
func masterTimerDidUpdate(item: Item, forGroup group: Group) {
if group == self.group {
let rowToUpdate = group.items.indexOf(item)
let newPath = NSIndexPath(forRow: rowToUpdate!, inSection: 0)
if let cell = self.tableView.cellForRowAtIndexPath(newPath) as? ItemCell {
cell.configureDurationLabelForItem(item)
}
}
}
我在 MasterView 方面也有类似的东西。我在视图中设置 masterTimer.delegate = self 确实加载了我要更新的 ViewControllers。我想不出任何其他地方我会说,因为我从已经提供的两个答案/提示中的理解暗示,如果视图在屏幕上处于活动状态,它会被加载并且不会留下内存,所以 masterTimer.无论 View 正在呈现,委托都应该在监听。
更新 #2: 我尝试设置这样的设备轮换通知:
NSNotificationCenter.defaultCenter().addObserver(self, selector: "didRotate:", name: UIDeviceOrientationDidChangeNotification, object: nil)
在我的 didRotate 我有以下内容:
func didRotate(notification: NSNotification) {
print("device rotated")
selectedCellIndexPath = nil
masterTimer.delegate = self
self.tableView.reloadData()
}
我还在上面的委托方法上添加了一条打印语句,以查看它是否正在触发。当设备处于纵向时,代表正在触发。如果我在主视图中选择一个单元格来显示我的组视图,它也会触发。但是,如果我在纵向和切换到横向时将成为屏幕上的主视图,则它不会触发。通知在轮换时触发,但委托似乎不再监听,因为打印语句在轮换后没有触发。
【问题讨论】:
-
不确定每秒运行的计时器是否是最佳解决方案(这不会阻塞主 UI 线程吗?)。您可以将更改与不同的事件联系起来吗?此外,作为测试,尝试将间隔延长一点,看看代表是否在两个地方都开火。
-
我的计划是将计时器更改为在 1 分钟触发,但我耐心等待这么长时间,同时我试图弄清楚为什么我无法让两个视图都更新。尽我所知,尽管每秒触发一次计时器不会对用户体验产生不利影响,即使它阻塞了我正在做的主线程。我没有注意到任何滞后
-
尝试了 10 秒的间隔,两者都没有更新
-
您是在实例化两个不同的要委托的对象,然后在每个视图控制器中设置它们,还是一个具有两个委托的对象?此外,在您删除 NSTimer 组件后,如果正常的 delegation 模式不起作用,请考虑将此作为错误报告提交给 Apple
-
我会在 viewDidLoad 中设置通知观察者。