objective-c - custom view swift
IBOutlet es nil dentro de UIView personalizado(usando STORYBOARD) (6)
Acabo de tener exactamente el mismo problema y la solución es muy fácil:
Estás accediendo a myImage
para pronto, eso es todo.
Con -(id) initWithCoder:(NSCoder *)aDecoder{
y - (id)initWithFrame:(CGRect)frame
no se ha UIView
la vista UIView
. Así que myImage no está todavía inicializado.
Puede probarlo si agrega un UIButton
y una IBAction
y hace algo como esto:
- (IBAction)buttonClicked:(id)sender {
NSLog(@"%@",myImage);
}
Y verás cómo myImage
ya no es nil
.
Tengo una clase UIView
personalizada. Dentro de ella he declarado una propiedad UIImageView
para UIImageView
.
#import <UIKit/UIKit.h>
@interface SettingItem : UIView{
}
@property (strong, nonatomic) IBOutlet UIImageView *myImage;
@end
Ahora estoy usando el guión gráfico. Hay un controlador de vista. UIView
para ver el controlador. UIImageView
un UIImageView
como una subvista de UIView
anterior. Configuré la clase "SettingItem" en UIView
desde el guión gráfico. Conecté la salida a myImage arrastrando normalmente desde las salidas de SettingItem
desde la ventana de utilidades.
Implementación de SettingItem
#import "SettingItem.h"
@implementation SettingItem
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
[self baseInit];
}
return self;
}
-(id) initWithCoder:(NSCoder *)aDecoder{
self = [super initWithCoder:aDecoder];
if (self) {
// Initialization code
[self baseInit];
}
return self;
}
- (void) baseInit{
NSLog(@"myImage %@"self.myImage);
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
// Drawing code
}
*/
@end
Ahora mi problema es que mi myImage
siempre es nil
, por encima de NSLog
solo imprime (null)
para la salida. Revisé la vista en el guión gráfico y verifiqué su referencia de salida y su señalamiento a myImage
. Me estoy perdiendo algo. Busqué en Google la ayuda pero no pude encontrar ninguna solución.
¿Puede por favor indicar qué estoy haciendo mal?
En su opinión, invalide awakeFromNib: este es el primer método de ciclo de vida al que se llama después de que se hayan asignado los IBOutlets y es el lugar correcto para su código.
Inicialízalos en awakeFromNib:
- (void)awakeFromNib
{
//init code
}
Llame a [self baseInit]
dentro de -(void)viewWillAppear:(BOOL)animated
. myImage
debería tener un valor allí.
#import "SettingItem.h"
@implementation SettingItem
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
}
-(id) initWithCoder:(NSCoder *)aDecoder{
self = [super initWithCoder:aDecoder];
if (self) {
// Initialization code
}
return self;
}
-(void)viewWillAppear:(BOOL)animated
{
[self baseInit];
}
- (void) baseInit{
NSLog(@"myImage %@"self.myImage);
}
Tuve problemas similares, pero finalmente descubrí lo que estaba mal: era una diferencia en el idioma entre los archivos XIB y los guiones gráficos.
En todos los tutoriales que había visto con archivos Xib, si tuviera un UITableViewController crearía un DetailViewController para que me permitiera editar el contenido de los elementos en la tabla, entonces el tableViewController creó una instancia del DVC una vez que lo reveló por primera vez, pero luego reutilizó esa misma instancia de DVC cada vez que necesitaba editar otro elemento de la lista.
Con los guiones gráficos, parece que la vista revelada por una vista de tabla se crea normalmente como nueva cada vez que la vista de tabla la llama (y no llama la versión de init que se encuentra en la plantilla UIViewController). Como se indicó en una respuesta anterior, debe esperar hasta que aparezca "ViewDidLoad" para acceder a cualquiera de los controles, incluso si ya ha mostrado esta vista anteriormente.
Espero que esto ayude.
en su archivo .h necesita reemplazar su código:
#import <UIKit/UIKit.h>
@interface SettingItem : UIView{
}
@property (strong, nonatomic) IBOutlet UIImageView *myImage;
@end
Con este codigo
#import <UIKit/UIKit.h>
@interface SettingItem : UIView{
IBOutlet UIImageView*myImage;
}
@end
En realidad, no le está diciendo a Xcode lo que es myImage, solo lo está convirtiendo en una propiedad sólida y no atómica.