-1

セルに触れるとサブビューを追加するテーブルビューコントローラーが3つあります。これをビューコントローラー2であるユーザーサブビューと呼びましょう。VC2でボタンを押すと、別のサブビューが追加され、アクションサブビューを呼び出しましょう。

VC1 で必要なデリゲート プロトコル メソッドを呼び出すには、VC3 でアクションが必要です。VC1 はカスタム デリゲートをヘッダー ファイルにインポートし、Xcode は VC1 に必要なメソッドを正しく設定します。また、VC1 で VC3 をインスタンス化した後、VC1 でデリゲートを self に設定しました。

ただし、デリゲート メソッドは呼び出されません。subViews はこれを引き起こしますか? self を使用する際に概念的に欠けているものはありますか。すべての VC のために投稿するのは大量のコードであり、ネストされたサブビューとデリゲートで欠けている基本的なアイデアがあると思います。

ありがとう、どんな助けでも大歓迎です。

4

2 に答える 2

0

試す

(UIViewController*)[self.navigationController.viewControllers objectAtIndex:1]).callMethod

ここで、1はアクセスするスタック内のコントローラーの数です。

于 2012-09-25T22:20:15.857 に答える
0

複数のオブジェクト (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 で呼び出されます。

答えは自明であることは知っていますが(少し長い:-))、それでも問題がある場合は、ここからソースコードを確認して参照してください。

于 2012-09-11T05:32:58.320 に答える