ios - Las instancias de IBOutlet son(nulas) después de cargarse desde NIB
objective-c null (5)
Así es como 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];
}
Estoy trabajando en una aplicación para iPhone y obtengo (nulo) referencias a los campos de IBOutlet en mi controlador. Tengo una subclase UIViewController que se establece como Propietario del archivo en mi XIB. Tengo un conjunto de elementos de la interfaz de usuario que están conectados al controlador. Después de cargar desde NIB e intentar establecer propiedades en esos elementos de la interfaz de usuario, encuentro que son (nulos). Para aclarar, algún código:
ExpandSearchPageController.h:
@interface ExpandSearchPageController : UIViewController
{
IBOutlet UITextView * completeMessageView;
}
-(void)checkTextField;
@property (nonatomic, retain) IBOutlet UITextView * completeMessageView;
ExpandirSearchPageController.m:
@implementation ExpandSearchPageController
@synthesize completeMessageView;
-(void)checkTextField
{
NSLog(@"text field: %@",completeMessageView);
}
ExpandSearchPageController se establece como Propietario del archivo para ExpandSearchPage.xib. El UITextView de ExpandSearchPage.xib está conectado al completeMessageView.
Cuando llamo
ExpandSearchPageController * searchExpanderPage = [[ExpandSearchPageController alloc] initWithNibName:@"ExpandSearchPage" bundle:[NSBundle mainBundle]];
[searchExpanderPage checkTextField];
el resultado es
"text field: (null)"
Asegúrese de que la propiedad de vista de su controlador de vista (es decir, el propietario del archivo en este caso) esté conectada a la vista en su xib. Como su campo de texto es casi una subvista de eso, es importante que también se conecte (y no creo que la punta se cargue correctamente sin haberlo configurado).
Esta es la solución.
Los IBOutlets no están listos para usar hasta que el controlador de vista termina de cargarse.
Por ejemplo, si desea establecer una propiedad de texto UILabels, primero deberá establecer una NSString en su controlador y luego establecer la propiedad de texto de las etiquetas en algún lugar como viewDidLoad.
Así que en su primerViewController.m: (Esto es para guiones gráficos, pero se aplica la misma 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";
}
Luego en la .h de su segundoViewController:
@property (strong, nonatomic) IBOutlet UILabel *label;
@property (strong, nonatomic) NSString *stringForLabel;
Luego establecemos la propiedad de texto en UILabel, en viewDidLoad de secondViewController.m. En esta etapa, el IBOutlet se ha creado y está listo para funcionar.
- (void)viewDidLoad {
[super viewDidLoad];
self.label.text = self.stringForLabel;
}
Otra causa potencial de un puntero nulo de IBOutlet es olvidarse de guardar el archivo xib en Interface Builder después de crear la conexión de salida.
Supongo que hacer la pregunta después de analizar el problema durante más de una hora me llevó a resolverlo:
Acabo de cambiar mi código para verificar el cuadro de texto DESPUÉS de mostrar la vista ... ahora todo está instanciado.
Imagina que: los elementos de la interfaz de usuario no se crean instancias hasta que los muestres.