更新UISplitView控制器

时间:2015-09-17 03:40:15

标签: ios iphone swift ipad

我有一种感觉,我知道这个问题的答案,但想确认一下我的想法。

如果我错了,指针真的会有所帮助,因为我一直在搞乱代码,以及在网上搜索过去几个小时。

我有一个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语句在旋转后没有触发。

3 个答案:

答案 0 :(得分:0)

视图并不存在于队列中,主要或其他方面 - 所有UIViews,无论是否可见,都需要在主队列上更新,因为它们下面是图形系统......

似乎更多的是因为某种原因,一方只是不知道它应该更新,可能是因为你依赖像viewWillAppear这样的东西被调用而它不是?

无论如何,您应该可以随时更新任何视图。

答案 1 :(得分:0)

您可能希望在需要更新视图(包括其方向等)时使用NSNotification或协议通知每个视图控制器。只需发布已发生某些事件的通知,您就可以让每个视图控制器为自己做正确的事情。

答案 2 :(得分:0)

因此,经过一些狩猎后,我对代表的理解有点过时了。我以为这是一个通知队列,一切都在听。结果NotificationCenter做我想做的不是委托。通知中心是iOS中的消息传递队列,内存中的任何内容都可以侦听队列,如果他们知道如何处理它们对其执行操作的消息。为其他人发布这个答案,因为我很难找到答案。