2012-12-05 22 views
5

Mam niestandardową klasę UIView o nazwie MyView, której używam razem z UIViewController skonfigurowanym za pomocą scenorysu. Większość właściwości widoku jest konfigurowana za pomocą Konstruktora interfejsu; jednak muszę dostosować kilka obrazów programowo przed ustawiając je jako tła dla mojego przycisku, tak:Dopasowywanie UIView po załadowaniu z serii ujęć

-(void)setupVisuals { 
    UIImage *image = [[UIImage imageNamed:@"myButton.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 10, 0, 10)]; 
    // _myButton is an IBOutlet property set through the storyboard: 
    [_myButton setBackgroundImage:image forState:UIControlStateNormal]; 
} 

Problemem jest to, że nie mogę zadzwonić [self setupVisuals] z inicjatora *, ponieważ _myButton jest nil w ten czas.

I rozwiązać problem przez dodanie tej linii do MyViewController „s viewDidLoad:

[(MyView*)self.view setupVisuals]; 

Z tego połączenia w miejscu, wszystko działa bez zarzutu. Jednak wydaje się to raczej rozwiązaniem, niż rozwiązaniem tego, co prawdopodobnie jest stosunkowo częstym problemem.

Czy istnieje metoda nadpisania lub inny mechanizm służący do zakończenia inicjowania wizualizacji MyView bez wciskania w mechanizm viewDidLoad:?


* W tym przypadku, inicjator jest initWithCoder: ponieważ widok jest ładowany z ujęć. Sprawdziłem, czy inicjator został poprawnie wywołany, ale wizualizacje nie są jeszcze gotowe.

+0

IIRC 'initWithFrame:' ​​jest wywoływane nawet przy ładowaniu z NIB/XIB. Stamtąd, po wywołaniu "super", nie możesz tego zrobić? Pamiętam, że miałem podobny problem i rozwiązałem go, ale nie pamiętam dokładnie, jak dokładnie to było. –

+0

W takich przypadkach zwykle po prostu wykonuję "inicjalizację" w 'viewWillAppear', ale jeśli istnieje lepszy sposób na obsłużenie go, chciałbym to wiedzieć. Zasadniczo, kiedy widok jest wczytywany z storyboardu z nienaruszonymi wszystkimi jego punktami sprzedaży? –

+0

Czy wypróbowałeś tylko [self.myView setupVisuals] z metody viewWillAppear w swoim kontrolerze viewController? Jeśli zainicjowałeś ten widok w IB i ustawiłeś go jako gniazdko, to powinno działać. –

Odpowiedz

2

Wygląda na to, że poprawnie używasz viewDidLoad:. Według Apple docs:

Zazwyczaj zastąpić tę metodę, aby wykonać dodatkowe inicjalizacji na widoki, które zostały załadowane z NIB pliki.

Jeśli Twoim celem jest enkapsulacja tej funkcji na poziomie UIView, spróbuj layoutSubviews.

Powiązane problemy