0

В моей раскадровке я использую UINavigationController с панелью навигации для представления контроллера вида. Этот контроллер представления, ViewController2, помещается в стек, нажимая UIBarButtonItem, который я разместил в панели навигации. Я сделал это соединение в Interface Builder, перетащив его с панели на сцену ViewController2 и выбрав «push» для segue. Чтобы вернуться к первому контроллеру представления, у меня есть IBAction, который вызывает метод popViewControllerAnimated. Я использую метод делегирования для отправки данных обратно в первый контроллер представления, но строка из ViewController2 не отправляется обратно в ViewController.UIViewController в UINavigationController, не вызывающем метод делегата

Как передать текст, введенный в 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 

ответ

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]; 
} 
+0

Как я могу установить делегат на правильный экземпляр того, который я нажимаю? – wigging

+0

На месте вы нажали свой контроллер. –

+0

А, так задайте делегат в чем-то вроде 'prepareForSegue' вместо' viewDidLoad'? – wigging

Смежные вопросы