1

これはおそらく単純ですが、私は立ち往生しています!

基本的に私は親と子のView Controllerを持っていて、子から親にデータを渡そうとしています。

//子 VC インターフェース

@protocol ANSearchGetawayFilterDelegate
    -(void)selectedCell:(NSString *)cellTitle;
@end

@interface ANSearchGetawayFilterViewController : UIViewController <UITableViewDelegate,     UITableViewDataSource, UISearchBarDelegate>
{
   NSString* cellTitle;
}
@property (nonatomic, assign) id<ANSearchGetawayFilterDelegate> delegate;

@end

//子 VC の実装

@implementation ANSearchGetawayFilterViewController
@synthesize delegate = _delegate;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];
    cellTitle = selectedCell.textLabel.text;
    [[self  delegate] selectedCell:cellTitle];

    [self dismissModalViewControllerAnimated:YES];
}

//親 VC インターフェース

#import "ANSearchGetawayFilterViewController.h"

@interface ANGetawayFilterViewController : UIViewController <ANSearchGetawayFilterDelegate>
{
    NSString* _cellText;
}

//親 VC の実装

   - (id)initWithNibName:(NSString*)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil
    {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self)
        {
            // Custom initialization
            ANSearchGetawayFilterViewController *search = [[ANSearchGetawayFilterViewController alloc] init];
            search.delegate = self;
        }
        return self;
    }

//delegate method

    -(void)selectedCell:(NSString *)cellTitle
    {
        _cellText = cellTitle;
        NSLog(@"cell text %@", _cellText);
    } 

デリゲート メソッドが呼び出されることはなく、NSLog が _cellText である場合、それ以外の場合は null として表示されます...何が間違っていますか? ありがとう!

4

5 に答える 5

2

ほとんどのANSearchGetawayFilterViewController場合、提示時に新しいインスタンスを作成し、デリゲートを構成していません。

あなたが電話したとき

ANSearchGetawayFilterViewController *search = [[ANSearchGetawayFilterViewController alloc] init];
search.delegate = self;

のインスタンスを作成しANSearchGetawayFilterViewController、デリゲートを正しく設定しましたが、このインスタンスをどこにも格納していません。ANSearchGetawayFilterViewController後であなたがそれを提示するようになったとき、あなたは再び電話をかけます

ANSearchGetawayFilterViewController *search = [[ANSearchGetawayFilterViewController alloc] init];

これにより、完全に異なるインスタンスが得られるため、再度構成する必要があります。例えば

ANSearchGetawayFilterViewController *search = [[ANSearchGetawayFilterViewController alloc] init];
ANSearchGetawayFilterViewController *search1 = [[ANSearchGetawayFilterViewController alloc] init];

NSLog(@"%d", search1 == search);

#=> 0

コードを更新して修正するには

- (BOOL)textFieldShouldBeginEditing:(UITextField*)textField;
{
    BOOL shouldBeginEditing = YES; 
    NSLog(@"text field should begin editing"); 

    ANSearchGetawayFilterViewController *myANSearchGetawayFilterViewController = [[[ANSearchGetawayFilterViewController alloc] init] autorelease]; 
    myANSearchGetawayFilterViewController.delegate = self;    // <--- configure the delegate

    [self presentModalViewController:myANSearchGetawayFilterViewController animated:YES];
    [self closeAllPickers]; 
    return shouldBeginEditing; 
}

データを選択してから削除するためだけにこのviewControllerを一時的に提示する可能性が高いため、ivarにはしません。そのため、破棄して毎回新しいものを作成しても安全です。

于 2012-05-29T22:44:14.563 に答える
0

ARCを使用していますか?init 関数が終了すると、オブジェクト (およびデリゲートへの参照) がクリーンアップされるためです。検索変数をグローバル変数にする (ヘッダーで定義し、コードで初期化する) とどうなりますか?

于 2012-05-29T22:49:10.107 に答える
0

ARC を使用していると仮定します。

@propertyインスタンスの保持を作成する必要がありANSearchGetawayFilterViewControllerます。デリゲート メソッドが呼び出されるまでに、ARC によって解放されます。このようなことをしてください。

@property (strong, nonatomic) ANSearchGetawayFilterViewController *search;
...
@synthesize search = _search;

- (id)initWithNibName:(NSString*)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self)
    {
        // Custom initialization
        self.search = [[ANSearchGetawayFilterViewController alloc] init];
        self.search.delegate = self;
    }
    return self;
}

問題とは関係ありませんが、次のように、デリゲートが実際に呼び出す前に期待するメソッドを実装しているかどうかを確認することをお勧めします。

if ([self.delegate respondsToSelector:@selector(selectedCell:)]) {
    [self.delegate selectedCell:cellTitle];
}
于 2012-05-29T22:50:40.803 に答える
0

逆に、デリゲート メソッドが呼び出されています (したがってNSLog())。ただし、渡される値が nil なので、_cellText は (null) ですselectedCell.textLabel.text

于 2012-05-29T22:37:42.850 に答える
0

まず、-selectedCellメソッドが呼び出されていることは確かですか?

これを行うには、前または後に NSLog() を配置し-tableViewDidSelectRowます ...

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    ...
    NSLog(@"TABLEVIEW DID SELECT ROW BEFORE -> %@ <-", cellTitle);
    [[self  delegate] selectedCell:cellTitle];
    NSLog(@"TABLEVIEW DID SELECT ROW DELEGATE CALLED");
    ...
}

また、いくつかのクリーンアップを実行することもできます (オプション)

まず、初期化メソッドでリークしています。デリゲートを使用して親クラスのプロパティとして を設定するかANGetawayFilterViewController、デリゲートを設定した後に解放します。

次に、コードでは、デリゲートにメソッドがコーディングされ-tableViewDidSelectRowていることを前提としています。-selectedCellメソッドが実装されていない場合、アプリケーションはクラッシュします。-respondsToSelector...デリゲートが次のことを確認することで、これを防ぐことができます。

if ([self.delegate respondsToSelector:@selector(selectedCell:)]) {
    [self.delegate selectedCell:cellTitle];
}

第 3 に、parentViewController に通知するためにデリゲートによって呼び出されるメソッドは、-numberOfRowsInSection( UITableViewDelegate) を除いて、デリゲート メソッドが使用する一般的なスキーマに従っていません。メソッドにも実際のANFilterGetawayViewControllerインスタンスが含まれている必要があります。

- (void) filterGetawayViewController:(ANSearchGetawayFilterViewController *) controller didSelectCellWithTitle:(NSString *) title {

    ...

}

次のように呼び出すことができます。

[self.delegate filterGetawayViewController:self didSelectCellWithTitle:cellTitle];
于 2012-05-29T22:38:50.777 に答える