Question

Je travaille sur une application iPhone et je reçois (null) références aux champs IBOutlet dans mon contrôleur. J'ai une sous-classe UIViewController qui est défini comme le propriétaire dans mon dossier du XIB au catalogue. J'ai un ensemble d'éléments de l'interface utilisateur qui sont câblés dans le contrôleur. Après le chargement de NIB et de tenter de définir des propriétés sur les éléments de l'interface utilisateur, je trouve qu'ils sont (null). Pour clarifier, un code:

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 est défini comme propriétaire pour ExpandSearchPage.xib du fichier. UITextView de ExpandSearchPage.xib est câblé au completeMessageView.

Quand j'appelle

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

[searchExpanderPage checkTextField];

le résultat est

"text field: (null)"
Était-ce utile?

La solution

Je suppose que poser la question après avoir examiné le problème pendant plus d'une heure m'a amené à le comprendre:

Je viens de modifier mon code pour vérifier la zone de texte après l'affichage de la vue ... maintenant tout est instancié.

Imaginez que: les éléments de l'interface utilisateur ne sont pas instanciés jusqu'à ce que vous les afficher

Autres conseils

Ceci est la solution.

Les IBOutlets ne sont pas prêts à l'emploi jusqu'à ce que le contrôleur de vue se termine le chargement.

Par exemple, si vous souhaitez définir une propriété de texte UILabels, vous devez définir un NSString sur votre premier contrôleur, puis définissez la propriété de texte des étiquettes dans un endroit comme viewDidLoad.

Donc, dans votre firstViewController.m: (Ceci est pour storyboards, mais même idée s'applique)

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

Ensuite, dans le .h de votre secondViewController:

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

Ensuite, nous avons mis la propriété de texte sur la UILabel, dans le viewDidLoad de secondViewController.m. A ce stade, la IBOutlet a été créé et est prêt à aller.

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

Une autre cause potentielle d'un pointeur nul IBOutlet oublie pour enregistrer le fichier dans Interface Builder xib après avoir créé la connexion de sortie.

Assurez-vous que la propriété vue de votre contrôleur de vue (c.-à-propriétaire du fichier dans ce cas) est câblé à la vue dans votre xib. Comme votre textField est presque certainement une sous-vue de cela, il est important d'obtenir que câblés en trop (et je ne pense pas que la pointe se charge correctement sans cet être ensemble).

Voici comment je le fais:

//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];
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top