2012-04-16 15 views
41

Bir ViewController'da, VC'nin ne zaman yüklendiğini öğrenmek için ViewDidLoad vardır.UIView için IOS viewDidLoad

UIView için, görünüm yüklendiğinde hangi yöntemi kullanmam gerekiyor?

Bu yöntem herhangi bir init ile çağrılabilir mi?

düzenleme: Hayır XIB, sadece program aracılığıyla.

+0

sen onu yüklenen nerede bağlıdır ... – borrrden

+0

hi teşekkürler, ben bir viewController – MaKo

cevap

-6

Bu şekilde çalışmıyor. Görünüm denetleyicisi yüklendiğinde, Görünüm denetleyicisinin görünümü yüklendiğinde çağrılır.

Böylece, UIViewController'ı oluşturabilir ve çağrılacak tek yöntem, onu başlatmak için kullanılan init yöntemleridir. görünüm, oluşturulmayacak - (boşluk) viewDidLoad yöntemi çağrılmaz vb Sonra

başka bir şey aracılığıyla, kendi görünümü için görünüm denetleyicisi sorar:

viewController.view; 

görünümü denetleyicisi sonra aramaları :

- (void)loadView; // This is where you put your own loading view information, and set the viewController's self.view property here. 

Ardından: Aksi yüzden

- (void)viewDidLoad; 

Görünüm mü Yük ayrı yöntemdir gerçek loadView yöntemini ve karmaşık görünüm yükleme seçeneklerini kesmek zorunda. Geliştiricilerin Apple'ın yaptıklarından ve en iyi uygulamalarının ne olduğundan emin olmadıklarında nibs vb. Kullanırken alt sınıflandırma ve geçersiz kılma yöntemi sorunlara yol açabilir, bu nedenle Apple'ın bu yöntemi ayırması akıllıca olur. Bir bellek uyarı geldiğinde

Sonra, görünüm nil yayınlandı ve ayarlanır:

- (void)viewWillUnload; 
// view unloaded and set to nil. 
- (void)viewDidUnload; 
+54

bu nasıl uiviewcontroller çalışmıyor UIView ... – ngb

+3

Bu cevap kesinlikle soru işareti yansıtmıyor ... asker hiçbir görünüm denetleyicisi istiyor. –

+1

doğru cevap buradadır http://stackoverflow.com/a/4502761/2757496 – kaushal

30

Bir XIB dosyasından yüklerseniz, XIB'den yüklendiğinde awakeFromNib yöntemi çağrılır. Hiçbir XIB'nin durumunda

düzenlemek, muhtemelen (örneğin, didMoveToSuperview) the docs ait Gözlem Görüntüleme İlgili Değişiklikler bölgesinden yöntemlerden birini kullanarak anlaması gerekir. Ancak, daha iyi bir yol viewDidLoad yöntemindeki görünüm denetleyicisinden görünümlerinize bir ileti göndermektir.

+0

merhaba görünümünden yükleme Merhaba, benim soru, hiçbir XIB, ju düzenleyecektir Programatik – MaKo

+0

mükemmel cevap, kesinlikle doğru! – myusuf3

+0

UIView yeniden yüklendiyse tekrar yanıyor mu? – dumbledad

0

olarak bildiğim kadarıyla, ben init haricinde böyle bir yöntem var sanmıyorum. Genellikle init yönteminde hazırlık yaparım. Kendi viewDidLoad yönteminizi oluşturabilir ve manuel olarak arayabilirsiniz. Ancak çoğu zaman, UIView, görüntü denetleyicisi tarafından yönetilir, böylece görünüm denetleyicinin görünümü yüklendiğinde bilmesi gerekir; görünümü yapılandırmak isterseniz, bunu görüntü denetleyicide yapabilirsiniz. Bu arada, viewDidLoad yöntemi her zaman aranmaz.

+5

Daha önce hiç görmedim viewDidLoad' * not *. Hangi şartlarda aranmaz? – devios1

2

Benzer bir problem yaşadım ve nispeten kolay bir çözüm buldum. Fikir, her çocuk görüşüne viewDidLoad öğesinin doğru zamanda gönderilmesi ve ilginizi çeken bir derse bu yöntemin yüklenmesidir.

Bunu yapmak için kodun bu bölümlerini sınıflarınıza ekleyin ...

// UIViewController 
- (void)viewDidLoad 
{ 

    [super viewDidLoad]; 

    [self.view viewDidLoad]; 
} 


// UIView+Loading.m 
#import < UIKit/UIKit.h> 

@implementation UIView (Loading) 

- (void)viewDidLoad 
{ 

    for (UIView* subview in self.subviews) 

     [subview viewDidLoad]; 
} 

@end 


// UIView+Loading.h 
#import < UIKit/UIKit.h> 

@interface UIView (Loading) 

- (void)viewDidLoad; 

@end 


// UIView_CustomImplementation 

- (void)viewDidLoad 
{ 

    NSLog(@"Do whatever you want to do in custom UIView after method viewDidLoad on UIViewController was called"); 

} 
7

Gerçek baskı, size görünümün başlatma için görünüm kontrolörün yöntemine viewDidLoad() ile bir şey yapmak değil. Yapmak istediğiniz her şeyde, görünümün init yönteminde yapabilirsiniz. Örneğin , görünüm kontrolörün viewDidLoad() olmak üzere bazı başlatma kodu vardır:

- (void)viewDidLoad{ 
    [super viewDidLoad]; 

    // init your parameters here 
} 

Benzer şekilde, sizin görünümün init yönteminde: Sonra

- (id)initWithDelegate:(id)_delegate 
{ 
    self = [[[[NSBundle mainBundle] loadNibNamed:@"YourView" owner:self options:nil] objectAtIndex:0] retain]; 
    if (self) { 
     [super init]; 

     self.delegate = _delegate; 

     // init your parameters here 

     return self; 

    } 
    return nil; 
} 

, böyle görünüm denetleyicisinden YourView oluşturun:

Daha
YourView view = [[YourView alloc] initWithDelegate:self]; 
[self.view addSubview:view]; 
[view release]; 

, böyle, senin görünümünde görünüm yükünü yaptım, sen layoutSubviews yönteminde yerleştirebilirsiniz yapmak istediklerimizi:

-(void)layoutSubviews{ 
    [super layoutSubviews]; 

    // init your parameters here, like set up fonts, colors, etc... 
} 

Sanırım ihtiyacınız olan şey bu.

Şerefe!

4

Swift 2:

import UIKit 

class myView: UIView { 

    override func layoutSubviews() { 
    print("run when UIView appears on screen") 
    // you can update your label's text or etc. 
    } 
} 
+1

Bunun Swift 2 ile ilgisi yoktur. Kısıtlama tabanlı düzen için geçersiz kılma noktasıdır. Yorumu çerçeveye gönderme: "geçersiz kılma noktası. LayoutIfNeeded tarafından otomatik olarak adlandırılır. IOS 6.0'dan itibaren, kısıtlamalar tabanlı düzen kullanıldığında temel uygulama kısıtlamalara dayalı düzeni uygular, aksi halde hiçbir şey yapmaz." –

+2

Uyarı: layoutSubviews birden çok kez yangın yapabilir ve kesinlikle herhangi bir kurulum kodunu (viewDidLoad gibi) yapacak yer değildir. –

1

kullanabilirsiniz WillMove (toSuperview newSuperview: UIView)

import UIKit 

final class myView: UIView { 

    override func willMove(toSuperview newSuperview: UIView?) { 
    //Do stuff here 
    } 
} 

Apple Docs

İlgili konular