IBOutlet jest zerowy w niestandardowym UIView (za pomocą STORYBOARD)

Mam zwyczaj UIView klasy. Wewnątrz niego zadeklarowałem IBOutlet właściwość dla UIImageView.

#import <UIKit/UIKit.h>

@interface SettingItem : UIView{

}

@property (strong, nonatomic) IBOutlet UIImageView *myImage;

@end

Teraz używam storyboardu. Istnieje viewcontroller. Przeciągnąłem UIView do viewcontroller. Przeciągnąłem jeden UIImageView jako podgląd powyżej UIView. Ustawiłem klasę "SettingItem" na UIView z storyboard. Podłączyłem gniazdko do myImage przez normalne przeciąganie z gniazd SettingItem z okna utilities.


SettingItem realizacja

#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

Teraz mój problem jest myImage jest zawsze nil, powyżej NSLog wystarczy wydrukować (null) dla wylotu. Sprawdziłem widok w storyboardzie i sprawdziłem jego odniesienie do wylotu i jego wskazanie na myImage. Coś mi umyka. Szukałem w googlach pomocy, ale nie mogłem znaleźć żadnego rozwiązania.

Czy możesz wskazać, co robię źle ?
Author: PruitIgoe, 2012-12-30

6 answers

Override awakeFromNib in your view - jest to pierwsza metoda cyklu życia, która zostanie wywołana po przypisaniu Iboutletów i jest właściwym miejscem dla Twojego kodu.

 64
Author: Oliver Dungey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-26 13:11:39

Zainicjalizuj je w awakeFromNib:

- (void)awakeFromNib
{
    //init code
}
 3
Author: inix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-16 05:52:03

Właśnie miałem dokładnie ten sam problem i rozwiązanie jest naprawdę proste:

Masz dostęp myImage do soon-to wszystko.

Withing -(id) initWithCoder:(NSCoder *)aDecoder{ i - (id)initWithFrame:(CGRect)frame UIView nie jest jeszcze narysowane. Więc mój obraz nie jest jeszcze initalizowany.

Możesz go przetestować, jeśli dodasz UIButton i IBAction i zrobisz coś takiego:

- (IBAction)buttonClicked:(id)sender {
    NSLog(@"%@",myImage);
}

I zobaczysz, że myImage już nie jest nil.

 2
Author: Fabio Poloni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-13 18:26:15

Miałem podobne problemy, ale w końcu zorientowałem się, co jest nie tak - była to różnica w idiomie między plikami XIB a Storyboardami.

We wszystkich samouczkach, które widziałem z plikami Xib, jeśli uitableviewcontroller stworzył DetailViewController, który pozwolił mi edytować zawartość elementów w tabeli, to tableViewController stworzył instancję DVC raz, kiedy po raz pierwszy ją ujawnił, ale potem ponownie użył tej samej instancji DVC, gdy potrzebowała edytować inny element w tabeli. lista.

W przypadku storyboardów wygląda na to, że widok a ujawniony przez Widok tabeli jest zwykle tworzony jako nowy za każdym razem, gdy widok tabeli go wywołuje (i nie wywołuje wersji init, która znajduje się w szablonie UIViewController). Jak wspomniano w poprzedniej odpowiedzi, musisz poczekać do "ViewDidLoad", aby uzyskać dostęp do któregokolwiek z kontrolek, nawet jeśli wcześniej pokazałeś ten widok.

Mam nadzieję, że to pomoże.

 0
Author: Harlan Howe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-30 15:52:38

Wywołanie [self baseInit] wewnątrz -(void)viewWillAppear:(BOOL)animated. myImage powinien mieć tam wartość.

#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);
}
 -3
Author: Rey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-09 20:20:23

W Twoim .plik h musisz zastąpić swój kod:

#import <UIKit/UIKit.h>

@interface SettingItem : UIView{

}

@property (strong, nonatomic) IBOutlet UIImageView *myImage;

@end

Z tym kodem

#import <UIKit/UIKit.h>

@interface SettingItem : UIView{

  IBOutlet UIImageView*myImage;

}

@end

Nie mówisz Xcode czym jest myImage, po prostu robisz z niego silną, nieatomową Właściwość

 -6
Author: OnkaPlonka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-30 09:02:11