2013-05-10 2 views
0

위임과 관련된 문제가 있습니다 .2 tabView가 있습니다. 첫 번째 tabview에서 나는 2 텍스트 필드 및 대리자 메서드를 트리거하는 단추가 있고 두 번째 tabview에서 첫 번째 tabview.Whats 잘못된 텍스트 코드의 내용을 표시하는 데 2 ​​레이블이 내 코드 ??? 제 tabviewA 들어iOS의 탭 막대보기간에 데이터를 전달하는 사용자 지정 위임

.H 파일

#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 대한 .H 파일

#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 : 동일한 프로세스로 탭뷰 A에 탭 B를 시도했지만 정상적으로 작동했습니다. 반대로 (즉, A에서 B까지) 전혀 작동하지 않습니다. 감사합니다

+0

정확하게 직면 한 문제는 무엇이며 "sayHello"가 ViewControllerB에서 호출되고 텍스트 값이 nil이 아닌지 확인 했습니까? – d4Rk

+0

어느 시점에서 '작동하지 않습니까?' 코드에 중단 점을 넣고 다음에 : IBACtion이 호출되는지 확인하고, 그렇다면 델리게이트가 올바르게 설정되었는지 여부를 확인하십시오. –

+0

ViewControllerA가 가장 먼저 표시되어야하는 경우 ViewControllerB가 대리인으로 설정할 기회가 있습니까? –

답변

1

ViewControllerB는 viewDidLoad 메소드에서 대리인으로 설정합니다. 이 메서드는 View Controller가 관리하는 뷰 (즉, view 속성)를로드하자마자 호출됩니다. 이 뷰는 누군가가 뷰 컨트롤러의 view 속성에 처음 액세스하려고 할 때만로드됩니다. here을 참조하십시오. ViewControllerB의 뷰가 아직로드되지 않았으므로 viewDidLoad 메서드가 아직 호출되지 않았을 가능성이 있습니다.

당신이 그렇게 같은 awakeFromNib 방법 오버라이드 (override)하는 경우 : 뷰 컨트롤러가 초기화 될 때 해당 메서드가 호출되기 때문에 그것이 작동해야

(void) awakeFromNib { 
    [super awakeFromNib]; 

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

합니다.

+0

도움을 주셔서 감사합니다. Maarten –