2010-01-22 16 views
11

Kendi .xib ile bir UIViewController var ve ekranın alt yarısında farklı bilgileri görüntülemek için UISegmentedControl kullanmak istiyorum. Bir UIView'i, the container .xib içinde yarattım ve onu, içerideki UIViewController'da detailView adlı UIView özelliğine bağladım.Bir UIView içine .xibs yükleniyor

IB'de üç .xib dosyası oluşturduktan sonra, her segmentin detailView alanında görüntülenmesi gerektiği görünümüne sahip oldum.

Artık takılıyorum çünkü uygun .xib dosyasını detailView alanına yükleme ve boşaltma işlemini bilmiyorum.

- (void)segmentValueChanged:(id)sender { 
    switch ([sender selectedSegmentIndex]) { 
     case 0: 
      // Unload whatever is in the detailView UIView and 
      // Load the AddressView.xib file into it 
      break; 
     case 1: 
      // Unload whatever is in the detailView UIView and 
      // Load the ContactsView.xib file into it 
      break; 
     case 2: 
      // Unload whatever is in the detailView UIView and 
      // Load the NotesView.xib file into it 
      break; 
     default: 
      break; 
    } 
} 

Peki nasıl boşlukları doldurmak ve boşaltıyorlar/düzgün DetailView UIView yüklemek: nerede burada?

Teşekkürler!

viewDidLoad kod

--UPDATE--

artık: - (void) viewDidLoad { [süper viewDidLoad];

// Set the default detailView to be address since the default selectedSegmentIndex is 0. 
    NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"AddressView" owner:self options:nil]; 
    // assuming the view is the only top-level object in the nib file (besides File's Owner and First Responder) 
    UIView *nibView = [nibObjects objectAtIndex:0]; 
    self.detailView = nibView; 

    self.detailContainerView.autoresizesSubviews = YES; 
    [self.detailContainerView addSubview:self.detailView]; 

    NSLog(@"self.view is %@", self.view); 
    NSLog(@"self.detailContainerView is %@",self.detailContainerView); 
    NSLog(@"self.detailView is %@", self.detailView); 
} 

Ve ayıklayıcı mesajlarıdır:

self.view is UIView: 0x3a24d80; frame = (0 0; 320 460); autoresize = RM+BM; layer = CALayer: 0x3a35190 
self.detailContainerView is UIView: 0x3a1aea0; frame = (20 57; 280 339); autoresize = W+H; layer = CALayer: 0x3a36b80 
self.detailView is UIView: 0x3a24d80; frame = (0 0; 320 460); autoresize = RM+BM; layer = CALayer: 0x3a35190 

teşekkürler!

cevap

24

NSBundle'in loadNibNamed:owner:options: kullanın. NIB dosyasında tüm üst düzey nesnelerin bir dizisini döndürür ve ardından ivar'larınıza atayabilirsiniz. Dizideki birden çok nesne arasında ayrım yapmanız gerekiyorsa, her birine IB'de benzersiz bir etiket verin.

bu deneyin:

Eğer Interface Builder AddressView.xib için Dosyanın Sahibi olarak görünümü denetleyicisi belirttiniz ve görünüm kontrolörün DetailView prizine XIB'nin görünümü bağladıysanız
case 0: 
    [[NSBundle mainBundle] loadNibNamed:@"AddressView" owner:self options:nil]; 
    break; 
... 

ardından bağlantıyı view ile self.detailView arasında, loadNibNamed çağrısından sonra (self'i sahip olarak belirttiğiniz için) sonra olmalıdır.

case 0: 
    NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"AddressView" owner:self options:nil]; 
    // assuming the view is the only top-level object in the nib file (besides File's Owner and First Responder) 
    UIView *nibView = [nibObjects objectAtIndex:0]; 
    self.detailView = nibView; 
    break; 
... 

anahtarı açıklamada tüm durumlar için de yapın: Bu işe yaramazsa

, böyle bir şey deneyin. DetailView öğesini olarak bildirdiyseniz, self.detailView = ... ataması önceden yüklenmiş olan tüm görünümleri yayınlamaya özen gösterir. NIB içeriğinin özellikle boşaltılmasına gerek yoktur.

+0

Bunu nasıl bir araya getireceğimi pek emin değilim. .xib'lerin her biri için 'loadNibNamed: owner: options:' öğesini çağırmam mı gerekiyor?Bunun nasıl yapılacağına dair fikir edinmek için bazı kaba kodları görmek mümkün mü? Çok teşekkürler! –

+0

Cevabım için bazı kodları ekledim. –

+0

Ole, harika kod için teşekkürler! İçinde bulunduğum tek sorun, -loadNibNamed'i çağırdığımda: sahip: seçenekleri NIB'nin içinde olması gereken tüm görünümün üzerine yerleştirilir. Görünen o ki, self.detailView = nibView; 'yüklenen NIB'yi, IB'de oluşturulan detay Görünümü'ne sığacak şekilde yeniden boyutlandırmıyor. Burada herhangi bir fikir var mı? Teşekkürler! –

1

Temelde istediğini yapmak UIViewController'ın initWithNibName kullanmak gerekir: En AddressView xib olarak

UIViewController *aViewController = [[UIViewController alloc] initWithNibName:@"AddressView" bundle:nil]; 
[self.detailView addSubview:aViewController.view]; 
[aViewController release]; // release the VC 

, UIViewController için dosya'nın sahibi sınıfını ayarlayın. Görünümün sınıfı özel AddressView sınıfı olmalıdır.

Bu şekilde, ana xib dosyasını kullanarak alt görünümü konumlandırabilir ve boyutlandırabilirsiniz. Sonra denetimleri düzenlemek için alt görüntünün xib kullanın.