我最近一直在做很多Objective-C编程,并且重新开始做更多的iPhone开发。我在其他语言/框架中使用MVC做了很多编程,但我只是想确保我在iPhone开发中正确使用MVC。
我创建了一个新的iPhone实用程序应用程序,它创建了两个视图:MainView和FlipsideView。两者都有一个控制器(FlipsideViewController和MainViewController)和他们自己的XIB文件。
我一直在做的是将IBOutlet UIControl myControl
变量放在我的MainView.h或FlipsideView.h文件中,然后将Interface Builder中的控件绑定到这些变量。然后我将任何IBAction SomeAction myAction
方法放在MainViewController.h和FlipsideViewController.h文件中,并将事件绑定到Interface Builder中的那些方法。
这似乎在概念上是正确的,但似乎会引起问题。假设我有一个按钮,单击它会更改标签的文本。因此,Controller不知道标签的变量名在我的按钮的OnTouchUp事件处理程序中是什么。所以我为它做了@property
。但由于MainViewController.view
属性不是MyView
类型,每当我尝试从视图控制器访问这些属性时,都会收到警告或错误。
我这样做是否正确?有一个更好的方法吗?如果这是正确的,我如何正确使用这些变量而不会收到警告或错误?
由于
以下是一些显示我正在做的事情的代码:
MainView.h
#import ...
@interface MainView : UIView
{
IBOutlet UILabel* label;
IBOutlet UIButton* button;
}
@property UILabel* label;
@property UIButton* button;
@end
MainViewController.m
-(void) buttonTouchUp:(id) sender
{
self.view.label.text = @"The button was pressed!"; //This gives error because label is not in the view structure or union
[self.view label].text = @"The button was pressed!"; //This gives a warning
}
我知道我可以将视图转换为正确的类型,但这似乎是一个黑客工作。 我知道我可以忍受这个警告,但警告告诉我,我正在做一些我可能不应该做的事情。我不相信SDK会让我不得不一直做这样的事情。
我必须误解View
应该是什么,而我使用的不正确。
答案 0 :(得分:2)
我亲眼看到和编写的大多数代码都会保留控制器上的所有插座和操作。该按钮向控制器发送消息(通过IBAction),然后控制器更新标签(通过IBOutlet)。换句话说,在你的观点上设置出口是不寻常的。
视图不应该连接到其他视图,除非它们有一些特殊的关系,比如可能是以UIWebView为目标的后退/前进按钮......但即便如此,您发现需要一个控制器来启用/禁用按钮合适的。