Domanda

Sto lavorando su un'applicazione per iPhone e sto (nulli) i riferimenti ai campi IBOutlet nel mio controller. Ho una sottoclasse UIViewController che è impostato come proprietario del file nel mio XIB. Ho una serie di elementi dell'interfaccia utente che vengono cablati nel controllore. Dopo aver caricato dalla NIB e il tentativo di impostare le proprietà su quegli elementi dell'interfaccia utente, trovo che siano (null). Per chiarire, un po 'di codice:

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 è impostato come proprietario del file per ExpandSearchPage.xib. UITextView di ExpandSearchPage.xib è collegato al completeMessageView.

Quando chiamo

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

[searchExpanderPage checkTextField];

il risultato è

"text field: (null)"
È stato utile?

Soluzione

Credo che porre la domanda dopo aver guardato il problema per più di un'ora mi ha portato a capirlo:

Ho appena cambiato il mio codice per controllare la casella di testo dopo aver visualizzato la vista ... ora tutto viene istanziato.

Immaginate: gli elementi dell'interfaccia utente non vengono create istanze fino a quando li si visualizzano

Altri suggerimenti

Questa è la soluzione.

I IBOutlets non sono pronti all'uso finché il controller della vista termine del caricamento.

Ad esempio, se si desidera impostare una proprietà di testo UILabels, si avrebbe bisogno di impostare un NSString sul controller prima, e quindi impostare la proprietà etichette testo in qualche parte come viewDidLoad.

Quindi nel tuo firstViewController.m: (Questo è per storyboard, ma lo stesso concetto si applica)

- (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";
}

Poi nel .h della vostra secondViewController:

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

Poi impostare la proprietà di testo sul UILabel, nel viewDidLoad di secondViewController.m. In questa fase, l'IBOutlet è stato creato ed è pronto ad andare.

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

Un'altra causa potenziale di un puntatore nullo IBOutlet sta dimenticando di salvare il file XI ter in Interface Builder dopo aver creato la connessione di uscita.

Assicurarsi che la proprietà di visualizzazione del controller della vista (cioè proprietario del file in questo caso) è cablata alla vista nel XI ter. Come il vostro textField è quasi certamente una visualizzazione secondaria di che, è importante per ottenere che cablato troppo (e non credo che il pennino verrà caricato correttamente senza che l'essere impostata).

Questo è come lo faccio:

//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];
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top