複数のオブジェクト (View オブジェクトまたは View Controller オブジェクト) 間でのメッセージの受け渡しは、基本的に同じ方法です。
上記の問題ステートメントでは、親ビューにサブビューとして追加するためにビューを使用するためだけに、3 つの UIViewController サブクラスを使用する理由が見つかりませんでした。UIView サブクラスを使用することで、まったく同じ目的を解決することもできます。
3 つの UIView サブクラスを使用しましたが、これらはすべて、呼び出し元のクラスにデリゲート メソッドを実装する必要があります。Main View Controller には次のような宣言があります
#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
First View の必要なデリゲート メソッドを 3 番目のビューから呼び出す最も簡単な方法は、Second View の最後のデリゲート メソッドの実装で説明されています。
[self.objThirdView setCaller:objFirstView];
フローは次のようになります。
Main ViewController (MainVC) が FirstView のサブビューを追加 -> FirstView が TableView をロード -> TableCell が選択されている場合 -> MainVC で Delegate メソッドが呼び出される これにより、2 番目のビューをサブビューとして追加する必要があります。SecondView にボタンが表示される -> ボタンがタップされた (サード ビューのサブビューを追加するための MainVC のデリゲート メソッドの呼び出し。ThirdView にセグメント コントロールが表示される -> セグメント コントロールの値が変更された - > 選択したフィルターと必要なデリゲート メソッドの 1 つに従って、FirstView テーブルがリロードされるFirstView の が MainVC で呼び出されます。
答えは自明であることは知っていますが(少し長い:-))、それでも問題がある場合は、ここからソースコードを確認して参照してください。