Я просто пытаюсь понять, как работает делегат, и я в беде.как делегировать с 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 ничего.
очевидно все, что связано с раскадрой, методами и точками, спасибо за вашу помощь.
Да, событие кнопки подключено к «подправить внутри» в раскадровку к правильному методу (IBAction) добавить: (ID) отправитель, очевидно, в «AddNameViewController» , и я также пробовал использовать «заявление», о котором вы говорили, но ничего не происходит – Adarkuccio
Я добавил NSLog в оператор if, который вы сделали, и ничего не печатается, поэтому делегат не отвечает на этот селектор, не знаете, почему ... – Adarkuccio
, с которого вы сначала запускаете viewController, ViewCOntroller или AddNameViewController, coz, если AddNameViewController является первым, его делегат никогда не инициализируется, NSLog (self.delegate) равен нулю – duchuy