Pergunta

Eu estou trabalhando em um aplicativo para iPhone e estou recebendo (null) referências a campos IBOutlet no meu controlador. Eu tenho uma subclasse UIViewController que é definido como o dono do arquivo no meu XIB. Eu tenho um conjunto de elementos de interface do usuário que estão ligados ao controlador. Após o carregamento do NIB e tentar definir propriedades sobre esses elementos de interface do usuário, eu acho que eles são (null). Para esclarecer, algum código:

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á definido como proprietário do arquivo para ExpandSearchPage.xib. UITextView do ExpandSearchPage.xib é ligado ao completeMessageView.

Quando eu chamar

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

[searchExpanderPage checkTextField];

O resultado é

"text field: (null)"
Foi útil?

Solução

Eu acho que a pergunta depois de olhar para o problema por mais de uma hora levou-me a descobrir isso:

Eu só mudei meu código para verificar a caixa de texto depois de exibir a vista ... agora tudo é instanciado.

Imagine que: os elementos de interface do usuário não são instanciado até que você exibi-los

Outras dicas

Esta é a solução.

Os IBOutlets não está pronto para ser usado até o carregamento acabamentos controlador de vista.

Por exemplo, se você quiser definir uma propriedade UILabels texto, você precisa definir um NSString em seu controlador primeiro, e depois defina a propriedade rótulos texto em algum lugar como viewDidLoad.

Assim, no seu firstViewController.m: (Isto é para storyboards, mas mesma idéia se aplica)

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

Em seguida, no .h da sua secondViewController:

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

Em seguida, defina a propriedade de texto no UILabel, no viewDidLoad de secondViewController.m. Por esta fase, o IBOutlet foi criado e está pronto para ir.

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

Outra causa potencial de um ponteiro IBOutlet nulo é esquecendo-se de salvar o arquivo xib em Interface Builder depois de criar a conexão de saída.

Certifique-se a propriedade vista do seu controlador de exibição (Proprietário ou seja, do arquivo, neste caso) é ligado à vista em sua xib. Como seu textField é quase certamente uma subexibição disso, é importante para obter esse fio em muito (e eu não acho que o nib irá carregar corretamente sem esse conjunto de estar).

Isto é como eu fazê-lo:

//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];
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top