在没有界面构建器的情况下使用 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 切换视图的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章