在没有界面构建器的情况下使用 UIViewController 和 UIViews 切换视图的最佳方法是啥?

Posted

技术标签:

【中文标题】在没有界面构建器的情况下使用 UIViewController 和 UIViews 切换视图的最佳方法是啥?【英文标题】:What is the best way to switch views with UIViewController and UIViews without interface builder?在没有界面构建器的情况下使用 UIViewController 和 UIViews 切换视图的最佳方法是什么? 【发布时间】:2011-05-12 10:36:26 【问题描述】:

大家好,我想到了几个解决方案,但对它们不太满意,所以需要一些想法。

我有:

3 个 UIView 实例 view1、view2、view3 1个UIViewController实例,UIViewController1存储view1、view2和view3

我想要:

在 view1 中放置一个方法,告诉 UIViewController1 切换到 view2。

我是否需要在 view1 中传递对 UIViewController1 的引用?这是唯一正确的方法吗?

【问题讨论】:

只是出于兴趣,为什么不用界面生成器? 我不确定您所说的 对 UIViewController1 的引用到 view1 是什么意思。一个严格的规则是不惜一切代价避免循环引用。如果UIViewController1 知道view1,那么view1 应该知道UIViewController1。如果view1 需要回传,则使用委托、目标操作或通知,这些都不是硬耦合的。 对不起,我的意思是在 view1 中引用 UIViewController1。 @PeyloW 你能指出我使用委托或目标动作或通知方法的正确方向吗? @deanWombourne 我只是想看看是否有比使用界面生成器更正确的方法。我也只是不想要界面构建器文件的任何额外开销 【参考方案1】:

首先,这些是全屏视图吗?如果是这样,您应该考虑拥有 3 个视图控制器,每个视图一个,并且可能将它们安装在 UITabBarController 中,这与您描述的行为类似。但无论如何:

不,视图不应该告诉控制器做任何事情。

在 MVC 架构中,视图呈现信息并接收(某些)用户交互。控制者有责任决定如何处理该操作。

视图所做的作用是告诉控制器发生了交互。

所以对您来说主要问题是 - 什么事件会产生这种行为?

它是一个按钮吗?按钮(UIControl 的子类)使用目标动作模式来处理这种通信。您的视图应提供对按钮的引用:

@property (nonatomic, retain) UIButton *switcherButton;

接下来,您将在视图控制器中实现一个方法:

-(void)viewSwitcherButtonTapped:(id)sender;

这就是您的视图如何告诉控制器发生了 UI 事件。这就是它应该做的一切。由控制器决定,根据模型中的状态信息,或者根据它自己的内部状态或逻辑,当点击该按钮时应该发生什么。

最后,在创建视图之后,控制器会将自己连接到按钮:

[view.switcherButton addTarget:self action:@selector(viewSwitcherButtonTapped:) forControlEvents:UIControlEventTouchUpInside];

这样任何视图控制器都可以使用这个视图,并且视图不依赖于对控制器的引用(因为它不应该)。

但按钮只是一个示例,如果生成行为的事件不同,您的实现可能会有所不同。回答这个问题,也许我可以修改这个答案以适用。

你应该看看

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaDesignPatterns/CocoaDesignPatterns.html中的“模型-视图-控制器设计模式”、“目标-动作机制”和“委托”

【讨论】:

如果您使用的是 Interface Builder,您就不会想错方向。它迫使您遵循@Ball 解释的正确 MVC。【参考方案2】:

你有两个选择:

快速而肮脏的一个:只需在指向 UIViewController 的每个视图中声明一个属性,将其定义为 assign 以避免循环引用(我假设您将视图保留在视图控制器中)。那么你就可以通过这个属性调用uiviewcontroller上的方法了

好的:让每个视图广播一个通知,uiviewcontroller 注册这个通知,并在它的回调中做它需要做的事情。

【讨论】:

谢谢。生病寻找好方法。我想这就是与 IB 通信时 IBActions 的工作方式。 实际上,IBActions 不是通知,它们只是方法调用:)

以上是关于在没有界面构建器的情况下使用 UIViewController 和 UIViews 切换视图的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

NSViews 在界面构建器的对象菜单中的位置有啥不同吗?

使用界面构建器的灵活布局

在没有 Tomcat 管理器的情况下从 jenkins 自动部署战争文件

NHibernate 可以在没有迭代器的情况下保存集合吗?

如何在没有设置器的情况下设置私有变量值?

在没有查看器的情况下中继现代分页