2016-03-09 43 views
0

我有一个UIViewController(cardView)有一个视图计数器。有一个按钮,“菜单”,在右上角打开一个单独的UIViewController(cardsViewer),列出所有不同的卡片并作为模式打开。针对特定的UIViewController实例重复UIViewsControllers

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

问题是,当我去到cardView的新实例,如果它与原始实例相同,则查看计数器在cardView的第二个实例上更新,但是当您退出到原始cardView并且发送它(通过委托函数)更新的viewCount,它不刷新刷新标签。

我甚至有委托功能打印视图计数,显示它被接收,但它不会对视图做任何事情。即使视图的第二个实例被解散但第一个仍不更新,也会发生这种情况。

这几乎就像我一做第二个实例,就不能再修改第一个实例的UI。我用派遣获得主队列和所有这些,但它是无济于事。

帮助!

+1

您需要显示一些代码;看起来你没有保持对视图控制器实例的正确引用。 – Paulw11

+0

@ Paulw11呃哦,我应该保留一些第一个参考? – simplexity

+2

视图控制器与数组或字典或任何其他对象没有区别。你可以有多个实例,你需要在适合iOS的短时间内参考合适的实例 – Paulw11

回答

1

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

在我的应用程序中,我使用音频播放器来传输远程音频文件。和一个UITabBarController举行并提出我的看法。我在我的SongsViewController中有歌曲的桌面视图。当一行被点击时,有两件事发生...... 1)用户界面延伸到一个新的视图控制器,我的NowPlayingViewController和2)拨打我的ControllerClass,它处理从指定的URL获取歌曲,并开始播放。我需要我的ControllerClass的代表为NowPlayingViewController,这样当歌曲完成加载时,我可以发送更新到NowPlayingViewController上的UI。所以,里面的SongsViewController我这样做的didSelectRowAtIndexPathMethod ...

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的不同实例,而不是我引用并设置为我的ControllerClass的代理的实例。这意味着当ControllerClass去回调到NowPlayingViewController时,它会回调到与标签栏控制器提供的实例不同的实例!因此,我没有看到像他们应该发生的任何UI变化。

在我的情况下,因为我使用的是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 

} 

通过访问被保持的标签栏内,该视图控制器,我能够抓住到NowPlayingViewController这是正被呈现的一个,并且因此ControllerClass,在调用的相同的实例的引用回到它的代表,正确地回拨到由标签栏控制器呈现的NowPlayingViewController的实例。

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

+0

感谢@MikeG,疯狂的好解释。非常感谢!我只需要消化它,并得到类似的东西在我的。将我更新一次! – simplexity

+0

非常欢迎,请花时间,让我知道如果有什么不清楚我很乐意帮助您解决您的问题!我自己对iOS开发非常陌生,所以我知道它是什么样子!在纸上画出这对我来说是一个巨大的帮助,我强烈推荐它。这是一个漫长的解释,但它真的很简单,如果你可以直观地看到它 – MikeG

+1

更新:@MikeG,你的想法使我在正确的方向如何处理参考。虽然我没有完全按照你所做的,但它帮助我将方法存储在一个结构中,并在需要时调用它。谢谢! – simplexity