2013-05-10 1 views
0

У меня возникла проблема, связанная с делегированием. У меня есть 2 tabView. В первом tabview у меня есть 2 текстовое поле и кнопка (для запуска метода делегата), а во втором tabview у меня есть 2 ярлыка, чтобы отображать содержимое текстового поля в первом tabview.Whats неправильно с моим кодом ???Пользовательское делегирование для передачи данных между представлениями панели вкладок в iOS не работает

Для первого tabviewA заголовочного файл

#import <UIKit/UIKit.h> 
@class ViewControllerA; 
@protocol ViewControllerADelegate <NSObject> 
-(void)sayHello:(ViewControllerA*)viewController; 
@end 
@interface ViewControllerA : UIViewController<UITextFieldDelegate> 
@property (nonatomic,strong)IBOutlet UITextField *textFieldFirst; 
@property (nonatomic,strong)IBOutlet UITextField *textFieldSecond; 
@property (nonatomic,strong)id<ViewControllerADelegate>delegate; 
-(IBAction)next:(id)sender; 
@end 

и файл .m

#import "ViewControllerA.h" 
@interface ViewControllerA() 
@end 
@implementation ViewControllerA 
@synthesize textFieldFirst=_textFieldFirst; 
@synthesize textFieldSecond=_textFieldSecond; 
@synthesize delegate=_delegate; 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    _textFieldFirst.delegate=self; 
    _textFieldSecond.delegate=self; 
} 
- (BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    [textField resignFirstResponder]; 
    return NO; 
} 
-(IBAction)next:(id)sender 
{ 
    [self.delegate sayHello:self]; 
} 

@end 

А для второго tabbarViewB заголовочного файл

#import <UIKit/UIKit.h> 
#import "ViewControllerA.h" 
@interface ViewControllerB : UIViewController<ViewControllerADelegate> 
@property (nonatomic,strong)IBOutlet UILabel *labelFirst; 
@property (nonatomic,strong)IBOutlet UILabel *labelSecond; 

@end 

и .m файл

#import "ViewControllerB.h" 

@interface ViewControllerB() 

@end 

@implementation ViewControllerB 

@synthesize labelFirst=_labelFirst; 
@synthesize labelSecond=_labelSecond; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    ViewControllerA *viewControllerA=[self.tabBarController.viewControllers objectAtIndex:0]; 

    viewControllerA.delegate=self; 
    // Do any additional setup after loading the view. 
} 
-(void)sayHello:(ViewControllerA *)viewController 
{ 
    _labelFirst.text=viewController.textFieldFirst.text; 
    _labelSecond.text=viewController.textFieldSecond.text; 
} 

@end 

N.B: Я попробовал tabView B для табуляции A с тем же процессом и работал нормально. Обратное (от A до B) вообще не работает. Спасибо

+0

В чем именно проблема, с которой вы столкнулись, и вы проверили, что «sayHello» вызывается в ViewControllerB, а текстовые значения не ноль? – d4Rk

+0

В какой момент это «не работает»? Вы поставили точки останова в коде и убедитесь, что следующее: IBACtion вызывается, и если да, правильно ли установлен делегат и т. Д.? –

+0

Если ViewControllerA является первым, что нужно отобразить, имеет ли ViewControllerB возможность установить себя в качестве делегата? –

ответ

1

ViewControllerB устанавливает себя как делегат в своем методе viewDidLoad. Этот метод вызывается, как только контроллер просмотра загружает представление, которое он управляет (в свой view свойство). Это представление загружается только тогда, когда кто-то впервые пытается получить доступ к свойству view контроллера представления. См. here. Существует хорошая вероятность, что представление ViewControllerB еще не загружено, поэтому метод viewDidLoad еще не был вызван.

Если переопределить awakeFromNib метод, как так:

(void) awakeFromNib { 
    [super awakeFromNib]; 

    ViewControllerA *viewControllerA=[self.tabBarController.viewControllers 
             objectAtIndex:0]; 
    viewControllerA.delegate = self; 
} 

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

+0

Спасибо за помощь Маартен –

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