custom objective-c uiview storyboard iboutlet

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.