Iphone 使用UIViewController切换视图和不使用interface builder切换视图的最佳方式是什么?

Iphone 使用UIViewController切换视图和不使用interface builder切换视图的最佳方式是什么?,iphone,ios,uiview,uiviewcontroller,Iphone,Ios,Uiview,Uiviewcontroller,嘿,伙计们,我想了一些解决方案,但对它们不太满意,所以需要一些想法 我有: 3个UIView实例视图1、视图2、视图3 1个UIViewController实例,UIViewController1,用于存储view1、view2和view3 我想: 在view1中放置一个方法,该方法将告诉UIViewController1切换到view2 是否需要在view1中传递对UIViewController1的引用?这是唯一正确的方法吗?您有两种选择: 快速和肮脏的一个:只需在每个指向UIVie

嘿,伙计们,我想了一些解决方案,但对它们不太满意,所以需要一些想法

我有:

  • 3个UIView实例视图1、视图2、视图3
  • 1个UIViewController实例,UIViewController1,用于存储view1、view2和view3
我想:

  • 在view1中放置一个方法,该方法将告诉UIViewController1切换到view2
是否需要在view1中传递对UIViewController1的引用?这是唯一正确的方法吗?

您有两种选择:

快速和肮脏的一个:只需在每个指向UIViewController的视图中声明一个属性,将其定义为assign以避免循环引用(我假定您将视图保留在viewcontroller中)。然后可以通过此属性调用uiviewcontroller上的方法


好方法:让每个视图广播一个通知,uiviewcontroller注册此通知,并在其回调中执行它需要执行的操作。

首先,这些是全屏视图吗?如果是这样,你应该考虑有3个视图控制器,每个视图都有一个,也许安装在UITabBar控制器中,这与你所描述的行为类似。但无论如何:

不,视图不应告诉控制器执行任何操作

在MVC架构中,视图显示信息并接收(部分)用户交互。控制员有责任决定如何处理该行动

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

所以你的主要问题是-什么事件会产生这种行为

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

@property (nonatomic, retain) UIButton *switcherButton;
[view.switcherButton addTarget:self action:@selector(viewSwitcherButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
接下来,在视图控制器中,您将实现一个方法:

-(void)viewSwitcherButtonTapped:(id)sender;
这是视图告诉控制器发生UI事件的方式。这就是它应该做的。由控制器根据模型中的状态信息,或根据其自身的内部状态或逻辑,决定点击该按钮时应发生什么

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

@property (nonatomic, retain) UIButton *switcherButton;
[view.switcherButton addTarget:self action:@selector(viewSwitcherButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
这样,任何视图控制器都可以使用此视图,并且视图不依赖于对控制器的引用(因为它不应该)

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

你应该看看


中的“模型-视图-控制器设计模式”、“目标操作机制”和“委托”只是出于兴趣,为什么不使用interface builder?我不确定您所指的UIViewController1到view1的引用是什么意思。严格的规则是不惜一切代价避免循环引用。如果
UIViewController1
知道
view1
,那么
view1
就不应该知道
UIViewController1
。如果
view1
需要回复,则使用委派、目标操作或通知,这些不是硬耦合的。对不起,我是指在view1中引用UIViewController1。@PeyloW您能为我指出使用委派或目标操作或通知方法的正确方向吗。@Deanwomberne我只是想看看是否有其他方法比使用interface builder更正确。另外,我只是不希望界面生成器文件有任何额外的开销,谢谢。我会好好看看的。我想这就是iAction在与IB通信时的工作方式。实际上,iAction不是通知,它们只是方法调用:)如果您使用的是Interface Builder,您不会朝着错误的方向思考。它迫使您遵循@Ball解释的正确MVC。