【问题标题】:Update both sides of a UISplitView Controller更新 UISplitView 控制器的两侧
【发布时间】: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 中设置通知观察者。

标签: ios iphone swift ipad


【解决方案1】:

视图并不真正存在于队列中,无论是主队列还是其他视图 - 所有 UIView,无论可见与否,都需要在主队列中更新,因为它们底层的图形系统...

似乎出于某种原因,一方只是不知道它应该更新,可能是因为您依赖于诸如 viewWillAppear 之类的东西被调用,而事实并非如此?

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

【讨论】:

  • 肯德尔感谢您的回答。我用一些代码更新了这个问题。我正在使用协议和委托来监听变化。正如我提到的,它在不在拆分视图(iPhone Portrait)但不在拆分视图中时有效。
【解决方案2】:

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

【讨论】:

  • 汤米,我用代码更新了我的问题。我在调用委托的 MasterTimer 类上使用协议。如果我理解你的回答,这是做我想做的事情的正确方法,但正如我提到的,当我在屏幕上同时看到两个视图时,只听代表我们其中一个更新。
【解决方案3】:

因此,经过一番寻找,我对代表的理解有点偏离。我以为这是一个通知队列,一切都在听。原来 NotificationCenter 做我想要的不是委托。通知中心是 iOS 中的消息队列,内存中的任何内容都可以侦听队列,如果他们知道如何处理消息,他们就会对其采取行动。为其他人发布此答案,因为我很难找到此答案。

【讨论】:

    猜你喜欢
    • 2011-12-25
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    相关资源
    最近更新 更多