2013-03-20 5 views
1

Я просто пытаюсь понять, как работает делегат, и я в беде.как делегировать с IBAction между двумя разными UIViewController

У меня есть два класса (оба UIViewController), подключенные к раскадровке, первый (ViewController.h/m) содержит TableView с ячейками, а второй (AddNameViewController.h/m) просто удерживает TextField (где I хочу написать) и кнопку (Добавить имя)

как вы точно понимаете Я хочу, чтобы кнопка нажата, чтобы отправить в TableView то, что написано в TextField, довольно просто.

И поскольку у меня есть два разных контроллера и массив, содержащий данные, хранящиеся в виде таблицы, я хочу связать их с делегатом (просто чтобы узнать его).

здесь некоторый код:

ViewController.h

#import "AddNameViewController.h" 
@interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, AddNameViewControllerDelegate> 
@property (strong, nonatomic) NSMutableArray *array; 
@end 

ViewController.m

#import "ViewController.h" 
#import "AddNameViewController.h" 
@inferface ViewController() 

@end 

@implementation ViewController 
@synthesize array; 

-(void)addStringWithString:(NSString*)string 
{ 
[self.array addObject:string]; 
NSLog(@"%@", array); 
} 

-(void)viewDidLoad 
{ 
AddNameViewController *anvc = [[AddNameViewController alloc] init]; 
anvc.delegate = self; 

array = [[NSMutableArray alloc] initWithObjects:@"first", @"second", nil]; 
NSLog(@"%@", array); 
[super viewDidLoad]; 

} 

-(NSInteger)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSindexPath*)indexPath 
{ 
static NSString *simpleTableIdentifier = @"RecipeCell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 
if (cell == nil) 
{ 
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier]; 
} 

cell.textLabel.text = [array objectAtIndex:indexPath.row]; 
return cell; 
} 

@end 

AddNameViewController.h

@protocol AddNameViewControllerDelegate <NSObject> 

-(void)addStringWithString:(NSString*)string; 

@end 

@interface AddNameViewController : UIViewController 

@property (weak, nonatomic) id <AddNameViewControllerDelegate> delegate; 
@property (weak, nonatomic) IBOutlet UITextField *myTextField; 

-(IBAction)add:(id)sender; 

@end 

наконец AddNameViewControlle r.m

#import "ViewController.h" 

@interface AddNameViewController() 

@end 

@implementation AddNameViewController 
@synthesize myTextField, delegate; 

-(id)initWithNibName:(NSString*)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil 
{ 
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
if (self) { 
} 
return self; 
} 

-(void)viewDidLoad 
{ 
[super viewDidLoad]; 
} 

-(IBAction)add:(id)sender 
{ 
[self.delegate addStringWithString:self.myTextField.text]; 
// I've also tried with this but nothing --> [self.delegate addStringWithString:@"aa"]; 
} 

@end 

Массив инициализируется правильно, без ошибок, без предупреждений, без сбоев, просто не кажется, что метод «addStringWithString» даже не называется, потому что даже не NSLog ничего.

очевидно все, что связано с раскадрой, методами и точками, спасибо за вашу помощь.

ответ

0

в интерфейсе построителя AddNameViewController, вы подключили событие кнопки (Touch Up inside) в действие - (IBAction) добавить: (id) отправителя?

также попробовать этот

-(IBAction)add:(id)sender 
{ 
if([self.delegate respondsToSelector:@selector(addStringWithString:)]) { 
[self.delegate addStringWithString:self.myTextField.text]; 
} 
// I've also tried with this but nothing --> [self.delegate addStringWithString:@"aa"]; 
} 
+0

Да, событие кнопки подключено к «подправить внутри» в раскадровку к правильному методу (IBAction) добавить: (ID) отправитель, очевидно, в «AddNameViewController» , и я также пробовал использовать «заявление», о котором вы говорили, но ничего не происходит – Adarkuccio

+0

Я добавил NSLog в оператор if, который вы сделали, и ничего не печатается, поэтому делегат не отвечает на этот селектор, не знаете, почему ... – Adarkuccio

+0

, с которого вы сначала запускаете viewController, ViewCOntroller или AddNameViewController, coz, если AddNameViewController является первым, его делегат никогда не инициализируется, NSLog (self.delegate) равен нулю – duchuy