0

私のストーリーボードでは、UINavigationController とナビゲーション バーを使用してビュー コントローラーを表示しています。このビュー コントローラー ViewController2 は、ナビゲーション バーに配置した UIBarButtonItem をタップすることでスタックにプッシュされます。バー ボタンから ViewController2 シーンにドラッグし、セグエの「プッシュ」を選択することで、Interface Builder でこの接続を確立しました。最初のビュー コントローラーに戻るために、メソッドIBActionを呼び出す があります。popViewControllerAnimatedデリゲート メソッドを使用してデータを最初のビュー コントローラーに送り返していますが、ViewController2 からの文字列が ViewController に送り返されていません。

デリゲート メソッドを使用して、ViewController2 に入力されたテキストを最初の ViewController に戻すにはどうすればよいですか?

ViewController.h

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end

ViewController.m

#import "ViewController.h"
#import "ViewController2.h"

@interface ViewController () <UITableViewDelegate,UITableViewDataSource,Vc2Delegate>

@property (strong,nonatomic) NSArray *tableArray;
@property (weak,nonatomic) IBOutlet UITableView *listTableView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self.listTableView setDelegate:self];
    [self.listTableView setDataSource:self];

    self.tableArray = @[@"item 1",@"item 2",@"item 3"];

    ViewController2 *vc2 = [[ViewController2 alloc] init];
    [vc2 setDelegate:self];
}

# pragma mark - TableView

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.tableArray.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ItemCell" forIndexPath:indexPath];
    cell.textLabel.text = [self.tableArray objectAtIndex:indexPath.row];

    return cell;
}

#pragma mark - Delegate Method

- (void)returnFromVc2:(NSString *)userString {
    NSLog(@"delegate text is %@",userString);
}

@end

ViewController2.h

#import <UIKit/UIKit.h>

@protocol Vc2Delegate <NSObject>

- (void)returnFromVc2:(NSString *)userString;

@end

@interface ViewController2 : UIViewController

@property (weak,nonatomic) id <Vc2Delegate> delegate;

@end

ViewController2.m

#import "ViewController2.h"

@interface ViewController2 ()

@property (weak,nonatomic) IBOutlet UITextField *textField;

@end

@implementation ViewController2

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (IBAction)toPreviousVC:(id)sender {
    NSLog(@"user text is: %@",self.textField.text);

    [self.delegate returnFromVc2:self.textField.text];

    [self.navigationController popViewControllerAnimated:YES];
}

@end
4

1 に答える 1

0

プッシュするインスタンスと同じインスタンスではないローカル変数にデリゲートを設定します。

- (void)viewDidLoad {
    ....
    ViewController2 *vc2 = [[ViewController2 alloc] init];
    [vc2 setDelegate:self];
    ....
}

また、代理人が送信されたメッセージに応答できるかどうかを確認する習慣を付ける必要があります。

- (IBAction)toPreviousVC:(id)sender {
    NSLog(@"user text is: %@",self.textField.text);

    if ( [self.delegate respondsToSelector(@selector(returnFromVc2:))] ) {
        [self.delegate returnFromVc2:self.textField.text];
    }
    [self.navigationController popViewControllerAnimated:YES];
}
于 2013-10-13T16:37:39.867 に答える