我有一种感觉,我知道这个问题的答案,但想确认一下我的想法。
如果我错了,指针真的会有所帮助,因为我一直在搞乱代码,以及在网上搜索过去几个小时。
我有一个NSTimer在设定的时间范围内通过委托更新几个视图。
我认为将我的观点放在iPad和iPhone 6 Plus的分割视图上会很不错。我成功地将视图移动到了分割视图控制器中,但是当我旋转设备时,只有一侧通过委托更新(主人更新或详细信息更新),具体取决于我在旋转设备时在应用程序中的位置。当设备处于"拆分视图模式"时,该端继续更新。如果我单击主服务器中的新行并且主服务器正在更新(详细信息不是),则详细信息将开始更新,主服务器将停止。
我的猜测是因为委托在主队列上触发更新视图(据我所知,只有更新视图的方法)它只更新当前设置为活动的视图(IE为主即使它是可见的,如果我在查看什么变成细节视图时旋转,则不在主队列上。是这样的吗?你能不能同时在分割视图的两边发布更新?
我再次寻找更多可能吗?我有我的应用程序按预期工作,我只是想让它更普遍,并通过添加拆分视图更好地使用房地产。如果我不能同时更新拆分视图的两面,我将重新考虑我试图关闭的路径。
编辑: 谢谢你的回答。为了澄清我在做什么,我将添加一些代码:
protocol MasterTimerDelegate {
func masterTimerDidUpdate(item: Item, forGroup group: Group)
func masterTimerDidUpdateAllItems()
func masterTimerDidUpdateProgressForItem(item: Item, forGroup group: Group, withProgressCompleted progress: Double)
}
然后两个ViewControllers是否在MasterView区域或DetailView区域中实现该委托
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.delegate都应该正在侦听。
更新#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()
}
我还在上面的委托方法上添加了一个print语句,看它是否正在触发。当设备处于Portrait时,代理正在触发。如果我在主视图中选择一个单元格以显示我的组视图,它也会触发。但是如果我在画像中切换到横向时会在屏幕上显示主视图,它就不会触发。通知在旋转时触发,但是委托似乎不再在侦听,因为print语句在旋转后没有触发。
答案 0 :(得分:0)
视图并不存在于队列中,主要或其他方面 - 所有UIViews,无论是否可见,都需要在主队列上更新,因为它们下面是图形系统......
似乎更多的是因为某种原因,一方只是不知道它应该更新,可能是因为你依赖像viewWillAppear这样的东西被调用而它不是?
无论如何,您应该可以随时更新任何视图。
答案 1 :(得分:0)
您可能希望在需要更新视图(包括其方向等)时使用NSNotification或协议通知每个视图控制器。只需发布已发生某些事件的通知,您就可以让每个视图控制器为自己做正确的事情。
答案 2 :(得分:0)
因此,经过一些狩猎后,我对代表的理解有点过时了。我以为这是一个通知队列,一切都在听。结果NotificationCenter做我想做的不是委托。通知中心是iOS中的消息传递队列,内存中的任何内容都可以侦听队列,如果他们知道如何处理它们对其执行操作的消息。为其他人发布这个答案,因为我很难找到答案。