我有一个有视图计数器的UIViewController(cardView)。右上角有一个“菜单”按钮,用于打开一个单独的UIViewController(cardsViewer),列出所有不同的卡片,并作为模态打开。
在cardsViewer中,您可以单击列表中的一个按钮,它会覆盖相同类型的UIViewController(cardView)的模式,并显示相同的视图计数器,但不是“菜单”按钮,而是具有“返回“按钮。
问题是当我转到cardView的新实例时,如果它与原始实例相同,则视图计数器会在第二个cardView实例上更新,但是当你退回到原始的cardView并发送时它(通过委托函数)更新后的viewCount,它不会在刷新时更新标签。
我甚至让委托函数打印视图计数,显示它已被接收,但它对视图没有任何作用。即使在视图的第二个实例被解除但第一个实例仍未更新时,也会发生这种情况。
这几乎就像,我做第二个实例后,我再也无法在第一个实例上修改UI。我使用了dispatch get main queue和所有这些,但是没有用。
帮助!
答案 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实例。