В моей раскадровке я использую 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
Как я могу установить делегат на правильный экземпляр того, который я нажимаю? – wigging
На месте вы нажали свой контроллер. –
А, так задайте делегат в чем-то вроде 'prepareForSegue' вместо' viewDidLoad'? – wigging