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.
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.
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
}
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
.
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.
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);
}
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ść
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