在重复的UIViewsControllers

时间:2016-03-09 01:55:58

标签: ios xcode swift uiviewcontroller

我有一个有视图计数器的UIViewController(cardView)。右上角有一个“菜单”按钮,用于打开一个单独的UIViewController(cardsViewer),列出所有不同的卡片,并作为模态打开。

在cardsViewer中,您可以单击列表中的一个按钮,它会覆盖相同类型的UIViewController(cardView)的模式,并显示相同的视图计数器,但不是“菜单”按钮,而是具有“返回“按钮。

问题是当我转到cardView的新实例时,如果它与原始实例相同,则视图计数器会在第二个cardView实例上更新,但是当你退回到原始的cardView并发送时它(通过委托函数)更新后的viewCount,它不会在刷新时更新标签。

我甚至让委托函数打印视图计数,显示它已被接收,但它对视图没有任何作用。即使在视图的第二个实例被解除但第一个实例仍未更新时,也会发生这种情况。

这几乎就像,我做第二个实例后,我再也无法在第一个实例上修改UI。我使用了dispatch get main queue和所有这些,但是没有用。

帮助!

1 个答案:

答案 0 :(得分:1)

以下是每个请求的简单示例。

在我的应用中,我使用音频播放器来传输远程音频文件。还有一个UITabBarController来举行和展示我的观点。我有SongsViewController里面的歌曲的表格视图。当点击一行时,会发生两件事...... 1)用户界面转到一个新的视图控制器,我的NowPlayingViewController和2)调用我的ControllerClass来处理来自的ControllerClass指定的URL,并开始播放。我需要NowPlayingViewController的代理人为NowPlayingViewController,以便在歌曲加载完成后,我可以在didSelectRowAtIndexPathMethod上向用户界面发送更新。所以,在SongsViewController的{​​{1}}内,我做了这个......

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    //get a reference to the NowPlayingViewController, and set it as the delegate to the ControllerClass

    let nowPlayingVC = NowPlayingViewController()
    ControllerClass.delegate = nowPlayingVC
    self.tabBarController.selectedIndex = 1
}

BUT!当ControllerClass执行其委托回调到NowPlayingVC时,UI上没有任何事情发生!在我的头撞墙后......我发现这不起作用的原因是因为:  当点击一首歌曲时,标签栏控制器正在呈现它已经引用的NowPlayingViewController的实例。当一首歌被点击时,我还会抓住NowPlayingViewController的另一个参考,然后我使用该实例(引用)设置为ControllerClass的委托。这是一个问题,因为我的标签栏控制器所持有的NowPlayingViewController实例是NowPlayingViewController的一个不同实例,而不是我引用的实例,并设置为{{1}的委托}。这意味着当ControllerClass回调到ControllerClass时,它正在回调一个与标签栏控制器提供的实例不同的实例!因此,我没有看到任何像他们应该发生的UI发生的变化。

就我而言,由于我使用的是NowPlayingViewController,我能够做到这一点......

UITabBarController

通过访问标签栏中保存的视图控制器,我能够获取对正在呈现的override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { //find the instance of the NowPlayingViewController that is being presented, the one that i am VIEWING and set that instacne as the delegate to the ControllerCLass let nowPlayingVC = self.tabBarController?.viewControllers![1] as! NowPlayingVC ControllerClass.delegate = nowPlayingVC } 的SAME实例的引用,从而获取{{1}在回调其委托时,正确地回调标签栏控制器提供的NowPlayingViewController实例。

我假设您没有使用UITabBarController,但您的解决方案仍然是引用VC的SAME实例,并确保在这两个地方使用该实例!只需确保引用SAME实例。