当我在Objective-C中编程地工作时,没有nib文件,并在my:
中具有逻辑appViewController。m
在同一个类中,视图和视图元素发生了什么?这违背MVC模式吗?
我必须创建另一个类并通知两个类吗?
由你决定!如果你想要分离层(M,V,C),你可以通过编程方式创建你自己的视图,通过使用复合设计模式,在你的UIView子类中构建它,通过从你的控制器中删除绘图代码。这是…
- 你创建了一个"CustomCompositeView"扩展了UIView
- 在layoutSubview(继承自UIView)你将绘制你所有的UI元素
- 在你的CustomViewController你将使用loadView: 显示你的视图
- (void)loadView
{
CustomCompositeView *mainView = [[CustomCompositeView alloc] initWithFrame:aFrame];
[self setView:mainView];
[mainView release]; // remove this line if you are using ARC!
}
从技术上讲,它违背了MVC模式。你的V和C组合成一个物体。你可以把处理布局和绘图的代码分离到一个单独的UIView子类中。然后用loadView:
加载它// MyViewController.m
- (void)loadView {
MyView* myView = [[[MyView alloc] init] autorelease];
myView.delegate = self;
self.view = myView;
}
#pragma mark - MyViewDelegate Methods
- (void)myViewSaveButtonWasPressed:(MyView *)myView {
// do something
}
为了在视图和视图控制器之间通信,你可以定义一个委托协议。
// MyView.h
@class MyView;
@protocol MyViewDelegate <NSObject>
- (void)myViewSaveButtonWasPressed:(MyView *)myView;
@end
@class MyView : NSObject
@property (nonatomic, assign) id<MyViewDelegate> delegate;
// ...
当一个按钮在视图中被按下(或沿着那些行的其他东西)时,将其传递给委托。ViewController应该遵从委托方法,并以这种方式处理实际的逻辑。