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

时间:2011-05-12 10:36:26

标签: iphone ios uiview uiviewcontroller

嘿伙计们我想过几个解决方案,但对他们并不满意所以需要一些想法。

我有:

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

我想:

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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

@property (nonatomic, retain) UIButton *switcherButton;

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

-(void)viewSwitcherButtonTapped:(id)sender;

这是您的视图可以告诉控制器发生UI事件的方式。这就是应该做的一切。控制器可以根据模型中的状态信息来决定,也可以根据自己的内部状态或逻辑来决定点击该按钮时应该发生什么。

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

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

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

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

你应该看看

“{3}}中的”模型 - 视图 - 控制器设计模式“,”目标 - 行动机制“和”授权“

答案 1 :(得分:0)

您有两个选择:

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

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