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视图的实例,然后调用我的ViewController
在IBAction
,然后获取和发送数据的方法。 但我无法想象这是正确的做法。 或者我理解错了什么?
提前致谢。
不知道我是否正确理解了您的视图层次结构,但我不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];