当我从 UITableViewController 打开自定义 UIView 时,如何关闭自定义视图并返回表格视图?

Posted

技术标签:

【中文标题】当我从 UITableViewController 打开自定义 UIView 时,如何关闭自定义视图并返回表格视图?【英文标题】:When I open a custom UIView from a UITableViewController, how do I close the custom view and go back to the table view? 【发布时间】:2009-06-22 22:23:51 【问题描述】:

我在游戏中使用UITableViewController 作为菜单。表格视图为我的自定义 UIView 打开一个视图控制器,用于显示游戏。当游戏结束时,UIView 会收到通知(这有点破坏 MVC 主体),从那里我有点迷路了。

问题:

    UIView 可以与其控制器通信吗?怎么样? 一个控制器可以与启动它的控制器对话吗?怎么样? 如何在所有这些复杂的视图和控制器网络之间优雅地转换?

【问题讨论】:

我最后做了什么:创建一个包含所有游戏特定动作的“游戏控制器”。创建一个从游戏控制器继承的视图控制器。初始化后将视图的父级设置为视图控制器。 【参考方案1】:

    在此处使用委托协议。您的自定义游戏 UIView 可以使用 delegate 属性并在事件发生时调用此委托的方法(游戏结束、游戏暂停、视图关闭等)。这是一篇关于使用委托的精彩帖子:How do I create delegates in Objective-C?

    我建议使用 UINavigationController。您不一定需要显示导航栏,但如果您将视图控制器嵌套在导航控制器中,则可以访问 -pushViewControllerAnimated:-popViewControllerAnimated:,这使得在嵌套视图控制器级别之间导航变得非常容易。

    UINavigationController 的另一个好处 - 当您在视图之间切换时,您将获得漂亮的幻灯片动画。

与 UIKit UINavigationController/UIViewController 机制相比,您可能更喜欢其他 3rd 方机制。查看Three20 project,尤其是 TTNavigationCenter 类。

【讨论】:

嗯,我想我需要比这更深入的东西才能真正理解为什么 UIView 没有父/控制器字段,以及如何做到这一点正确,而不是漂亮。 我认为代理的想法是第一个问题的正确想法,它是从 UIView 传递消息而不会严重破坏 MVC 的最常见方式。导航控制器的想法也很好——导航控制器基本上是视图控制器的堆栈,因此每个控制器都有其“父”控制器的感觉。这个答案似乎非常适合,无论是在“正确”做事和“漂亮”做事的意义上。 +1 此外,UIView 没有父/控制器字段,因为 UIView 不一定必须有控制器。它可能有一个超级视图,它是视图对象的一个​​属性。 UIViewController 确实有 parentViewController 属性,但这仅对 UINavigationController 或类似的 UIKit 控制器有用。请注意,我添加了 Three20 项目的链接 - 您可能会发现 TTNavigationCenter 解决了您的一些问题。 Tim 的第二条评论是我一直在寻找的答案。谢谢:)

以上是关于当我从 UITableViewController 打开自定义 UIView 时,如何关闭自定义视图并返回表格视图?的主要内容,如果未能解决你的问题,请参考以下文章

当我触摸后退按钮时,为啥 UINavigationController 不弹出 UITableViewController?

UItableviewController 不加载数据

在导航栏中使用 UITableViewController

UIViewController 子类(模仿 UITableViewController)没有被释放

我无法让 UITableViewController 显示任何数据

UITableViewController 滚动默认行为