UIView中的IBAction – 与MVC兼容?

我试图了解Objective-C在iOS应用中MVC模式的实现。

现在我有一个DataProvider对象,它保存我的数据并将其提供给我的应用程序(Model)中的其他对象。

此外,我有一个视图(.xib)与一个额外的类( UIView ;让我们称之为“ViewClass”)。 我告诉我的视图是我的ViewClass的一个子类,所以我可以创buildIBOutlet到我的子视图,如标签和IBAction到我的button。 所以这显然是我在MVC模式中的视图。

最后但并非最不重要的,我有一个ViewController对象,它有一个对我的DataProvider的引用,并保存我的视图的对象。 当ViewController被加载到内存中时,它通过调用addSubview:(UIView *)view来实例化viewDidLoad的View并将其添加到其自己的addSubview:(UIView *)view 。 这是MVC模式中的我的控制器。

到目前为止好,但我不明白的是以下。 根据MCV-Pattern,View应该只显示ViewController提供的数据,它从Model中获取数据。 任何逻辑操作只能发生在ViewController因为它负责这种任务。 但是,如果我在我的“ ViewClass ”中创build一个IBAction ,我不得不在我的View中有一些编程逻辑。

可以说,我想提交一个表单,用户通过点击一个button在某个文本框中input的数据。 在我的ViewClass我有一个IBOutlet的文本字段,以便以后可以参考它,并阅读用户input的数据。 我有一个IBAction的button,可以捕捉点击事件。 发送数据的代码现在写在我的视图的IBAction方法中,所以我在我的视图中有程序逻辑。

对我的问题:这是不是违反了MVC模式?

我可能会传递我的ViewController引用到我的视图,而我创build视图的实例,然后调用我的ViewControllerIBAction ,然后获取和发送数据的方法。 但我无法想象这是正确的做法。 或者我理解错了什么?

提前致谢。

不知道我是否正确理解了您的视图层次结构,但我不build议将属于该模型的任何逻辑放入视图中。

我将使ViewClass UIControl的一个子类,所以它可以发送事件本身。 如果按下button,则发送viewController接收到的valueChangedEvent。

例如:

 // .h @interface ViewClass : UIControl @property (readonly, nonatomic) UIButton *button; // read only in public interface @property (readonly, nonatomic) UITextField *textField; @end // .m @interface ViewClass () @property (strong, nonatomic) UIButton *button; // readwrite in private interface @property (strong, nonatomic) UITextField *textField; @end @implementation ViewClass - (IBAction)buttonPressed:(UIButton *)sender { // send valueChanged event to target [self sendActionsForControlEvents:UIControlEventValueChanged]; } @end 

和你的viewController:

 - (void)viewDidLoad { [super viewDidLoad]; ViewClass *myView = ... [myView addTarget:self action:@selector(myViewDidChangeValue:) forControlEvents:UIControlEventValueChanged]; } - (IBAction)myViewDidChangeValue:(ViewClass *)sender { NSLog(@"Send \"%@\" to server", sender.textField.text); } 

你也可以使用addTarget:forControlEvents:用于视图的子视图。 所以你实际上可以将ViewClass的button连接到你的viewController,你可能无法在Interface Builder中做到这一点。

 [myView.button addTarget:self action:@selector(viewButtonTapped:) forControlEvents:UIControlEventTouchUpInside];