多个对象(视图对象或视图控制器对象)之间的消息传递本质上是相同的方式。
在上面的问题陈述中,我找不到任何理由采用三个 UIViewController 子类只是为了使用它们的视图来添加父视图上的子视图。采用 UIView 子类也可以解决同样的目的。
我取了三个 UIView 子类,它们都需要委托方法在调用类中实现。主视图控制器将有他们的声明,如
#import "FirstView.h"
#import "SecondView.h"
#import "ThirdView.h"
@interface ViewController : UIViewController <ItemPickerDelegate , AllowLoadDelegate>
{
FirstView* objFirstView;
SecondView* objSecondView;
ThirdView* objThirdView;
}
@property (nonatomic , retain) FirstView* objFirstView;
@property (nonatomic , retain) SecondView* objSecondView;
@property (nonatomic , retain) ThirdView* objThirdView;
@end
现在,同一个 View Controller 子类的实现看起来像
@implementation ViewController
@synthesize objFirstView;
@synthesize objSecondView;
@synthesize objThirdView;
-(void)dealloc {
[objFirstView release];
[objSecondView release];
[objThirdView release];
[super dealloc];
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self loadInitialView];
}
-(void)loadInitialView {
if (!objFirstView) {
self.objFirstView = [FirstView initWithNibName:@"FirstView" bundle:nil];
}
[self.objFirstView setCaller:self];
[self.objFirstView setCurrentContentMode:TableContentModeAll];
[self.view addSubview:objFirstView];
[objFirstView setFrame:CGRectMake(0, 0, 320, 220)];
}
- (void)viewDidUnload {
[super viewDidUnload];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
#pragma mark -Delegate From First View
- (void)didSelectTableView:(UITableView*)tableView atIndexPath:(NSIndexPath*)indexPath {
if (objSecondView) {
[objSecondView removeFromSuperview];
}
else if (!objSecondView) {
self.objSecondView = [SecondView initWithNibName:@"SecondView" bundle:nil];
}
[self.objSecondView setCaller:self];
[self.view addSubview:objSecondView];
[objSecondView setFrame:CGRectMake(0, 220, 320,60)];
}
- (void)didApplyFilter:(TableContentMode)filter {
NSLog(@"%d filter Loaded",filter);
}
#pragma mark -Delegate From Second View
- (void)didAllowLoadFilters:(BOOL)allow {
if (objThirdView) {
[objThirdView removeFromSuperview];
}
else if (!objThirdView) {
self.objThirdView = [ThirdView initWithNibName:@"ThirdView" bundle:nil];
}
[self.objThirdView setCaller:objFirstView];
[self.view addSubview:objThirdView];
[objThirdView setFrame:CGRectMake(0, 280, 320,30)];
}
@end
在第二视图的最后一个委托方法实现中提到了从第三视图调用所需的第一视图委托方法的最简单方法。
[self.objThirdView setCaller:objFirstView];
流程如下:
Main ViewController (MainVC) 添加 FirstView 的子视图 -> FirstView 加载一个 TableView -> 当一个 TableCell 被选中时 -> 在 MainVC 中调用 Delegate 方法。这需要将第二个视图添加为子视图。SecondView 显示一个按钮 -> 按钮被点击(调用 MainVC 中的委托方法以添加第三个视图的子视图。现在 ThirdView 显示一个段控件 -> 段控件值已更改 -> 根据选定的过滤器和所需的委托方法之一重新加载 FirstView 表在 MainVC 中调用 FirstView。
我知道答案是不言自明的(虽然有点冗长:-))但是如果您仍然有任何问题,您可以从这里检查源代码并从中获取参考。