Pregunta

Estoy trabajando en una aplicación para iPhone y estoy recibiendo (null) las referencias a campos IBOutlet en mi controlador. Tengo una subclase UIViewController que se establece como el propietario del archivo en mi XI ter. Tengo un conjunto de elementos de interfaz de usuario que están conectados en el controlador. Después de cargar a partir de cacao y al intentar establecer propiedades en los elementos de interfaz de usuario, me parece que son (nulo). Para aclarar, algo de 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 se establece como el propietario del archivo de ExpandSearchPage.xib. UITextView de ExpandSearchPage.xib se ata con alambre a la completeMessageView.

Cuando llamo

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

[searchExpanderPage checkTextField];

el resultado es

"text field: (null)"
¿Fue útil?

Solución

supongo que la pregunta después de ver el problema para más de una hora me llevó a averiguarlo:

Acabo de cambiar mi código para comprobar el cuadro de texto después de visualizar la vista ... ahora todo se crea una instancia.

Imagínese que: los elementos de interfaz de usuario no se crean instancias hasta que mostrarlas

Otros consejos

Esta es la solución.

Los IBOutlets no están listos para usar hasta que el controlador de vista termina de cargar.

Por ejemplo, si desea establecer una propiedad de texto UILabels, lo que se necesita para establecer un NSString en su primer controlador, y luego establecer la propiedad etiquetas de texto en algún lugar como viewDidLoad.

Así que en su firstViewController.m: (Esto es para guiones gráficos, pero misma idea 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";
}

A continuación, en el .h de su secondViewController:

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

A continuación, establezca la propiedad de texto en el UILabel, en el viewDidLoad de secondViewController.m. En esta etapa, el IBOutlet ha sido creado y está listo para funcionar.

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

Otra causa potencial de un puntero nulo IBOutlet es olvidar guardar el archivo xib en Interface Builder después de crear la conexión de salida.

Asegúrese de que la ventana de propiedades del controlador de vista (es decir, del propietario del archivo en este caso) está cableado a la vista en su xib. A medida que su textField es casi seguro que una subvista de eso, es importante conseguir que los cableados en demasiado (y no creo que la punta puede ser colocado correctamente sin que pueda set).

Esto es cómo lo hago:

//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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top