2009-08-11 12 views
19

Pracuję na aplikacji na iPhone'a i otrzymuję (zerowe) odwołania do pól IBOutlet w moim kontrolerze. Mam podklasę UIViewController, która jest ustawiona jako właściciel pliku w moim XIB. Mam zestaw elementów interfejsu użytkownika, które są podłączone do kontrolera. Po wczytaniu z NIB i próbie ustawienia właściwości dla tych elementów UI, stwierdzam, że są one (zerowe). Aby wyjaśnić niektóre kod:Instancje IBOutlet są (zerowe) po załadowaniu z NIB

ExpandSearchPageController.h:

@interface ExpandSearchPageController : UIViewController 
{ 
    IBOutlet UITextView * completeMessageView; 
} 

-(void)checkTextField; 

@property (nonatomic, retain) IBOutlet UITextView * completeMessageView; 

ExpandSearchPageController.m:

@implementation ExpandSearchPageController 

@synthesize completeMessageView; 

-(void)checkTextField 
{ 
    NSLog(@"text field: %@",completeMessageView); 
} 

ExpandSearchPageController jest ustawiony jako plik Właścicielem dla ExpandSearchPage.xib. Funkcja UITextView ExpandSearchPage.xib jest połączona z pełnym widokiemMessageView.

Kiedy zadzwonić

ExpandSearchPageController * searchExpanderPage = [[ExpandSearchPageController alloc] initWithNibName:@"ExpandSearchPage" bundle:[NSBundle mainBundle]]; 

[searchExpanderPage checkTextField]; 

wynik jest

"text field: (null)" 

Odpowiedz

49

Chyba zadać pytanie po spojrzeniu na problem przez ponad godzinę doprowadziło mnie to rozgryźć:

Właśnie zmienił się mój kod, aby sprawdzić w polu tekstowym po wyświetleniu widoku ... teraz wszystko jest tworzony .

Wyobraź sobie: elementy interfejsu użytkownika nie są tworzone, dopóki ich nie wyświetlisz!

+0

inny punkt zainteresowania, który złapał mnie. Podczas prezentacji widoku kontrolera modally z 'presentViewController: animowane: Zakończenie:' wszystkie IBOutlets będzie zerowa, aż pojawi się widok (co odkrył). Będziesz więc musiał uzyskać do nich dostęp poprzez blok zakończenia, który zostanie wywołany, gdy w modalu zostanie wywołane 'viewDidAppear'. – guptron

0

Upewnij właściwość widok z kontrolera widoku (właściciel tj pliku w tym przypadku) jest podłączony do widzenia w swojej XIb. Jako, że twoja textField jest prawie na pewno wyeksponowanym, ważne jest, aby to również było podłączone (i nie sądzę, aby stalówka ładowała się prawidłowo bez ustawiania).

3

Inną potencjalną przyczyną zerowego wskaźnika IBOutlet jest zapomnienie o zapisaniu pliku Xib w programie Interface Builder po utworzeniu połączenia wyjściowego.

+1

Wierzę, że był to problem we wcześniejszych wersjach XCode -% -R nie zapisywał automatycznie. Teraz to robi. Nadal +1 jest czymś, na co trzeba uważać. – mobibob

4

To jest rozwiązanie.

IBOutlety nie są gotowe do użycia, dopóki kontroler podglądu nie zakończy ładowania.

Na przykład, jeśli chcesz ustawić właściwość tekstową UILabeli, musisz najpierw ustawić NSString na kontrolerze, a następnie ustawić właściwość text etykiety w miejscu takim jak viewDidLoad.

Więc w firstViewController.m: (To jest dla storyboardów, ale odnosi się sama idea)

- (void)buttonPress:(id)sender { 
    [self performSegueWithIdentifier:@"mySegue" sender:self]; 
} 

- (void)prepareForSegue(UIStoryboardSegue *)segue sender:(id)sender { 
    SecondViewController *secondViewController = [segue destinationViewController]; 
    secondViewController.stringForLabel = @"My Label String"; 
} 

Następnie w ncurses.h swojej secondViewController:

@property (strong, nonatomic) IBOutlet UILabel *label; 
@property (strong, nonatomic) NSString *stringForLabel; 

Następnie ustawiamy tekst Właściwość na UILabel, w viewDidLoad z secondViewController.m. Na tym etapie IBOutlet został utworzony i jest gotowy do pracy.

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.label.text = self.stringForLabel; 
} 
0

To jak to zrobić:

//in your view controller 
-(void)setUp 
{ 
    [self.cardView layoutIfNeeded]; 
    LearnCardPlainText *cardNib = [[[UINib nibWithNibName:@"LearnCardPlainText" bundle:nil] instantiateWithOwner:self options:nil] objectAtIndex:0]; 
    cardNib.frame = self.cardView.frame; 
    [cardNib setUpWithPart:learnModel]; 
    [self.view addSubview:cardNib]; 
}