Anlayabildiğim kadarıyla, bazen bazı standart olmayan yeniden biçimlendirme yapmak için UINavigationBar'ın alt sınıfına girmek gerçekten gerekli. Bazen kategorileri kullanarak bunu yapmaktan kaçınmak mümkündür , ancak her zaman değil.
Şu anda, bildiğim kadarıyla, bir UIViewController içinde özel bir UINavigationBar ayarlamanın tek yolu IB (yani bir arşiv yoluyla) - muhtemelen bu şekilde olmamalı, ama şimdilik bununla yaşamalıyız.
Bu genellikle iyidir, ancak bazen IB kullanmak gerçekten mümkün değildir.
Bu yüzden üç seçenek gördüm:
- UINavigationBar alt sınıfını seçin ve hepsini IB'ye bağlayın, ardından her UINavigationController istediğimde ucu yükleme konusunda kafa yorun,
- Alt sınıflandırma yerine UINavigationBar davranışını değiştirmek için bir kategori içinde yöntem değiştirmeyi kullanın veya
- UINavigationBar alt sınıfını seçin ve UINavigationController'ı arşivleme / arşivden çıkarma ile ilgili biraz uğraşın.
UINavigationController'ı programlı olarak oluşturmam gerektiğinden, 1. Seçenek benim için uygulanabilir değildi (veya en azından çok can sıkıcıydı), 2 biraz tehlikeli ve bence son çare seçeneğiydi, bu yüzden 3. seçeneği seçtim.
Benim yaklaşımım, bir UINavigationController için bir 'şablon' arşivi oluşturmak ve onu arşivden çıkarmak ve onu geri döndürmekti initWithRootViewController
.
Bunu nasıl yapacağınız aşağıda açıklanmıştır:
IB'de, UINavigationBar için uygun sınıf kümesiyle bir UINavigationController oluşturdum.
Ardından, mevcut denetleyiciyi aldım ve kullanarak arşivlenmiş bir kopyasını kaydettim +[NSKeyedArchiver archiveRootObject:toFile:]
. Bunu simülatörde uygulama temsilcisi içinde yaptım.
Daha sonra arşivlenmiş sürümü alt sınıfıma ( xxd -i path/to/file
) gömmek için kaydedilen dosyadan c kodu üretmek için -i bayrağıyla 'xxd' yardımcı programını kullandım .
İçinde initWithRootViewController
bu şablonu arşivden çıkarıyorum ve kendini arşivden çıkarmanın sonucuna ayarlıyorum:
static unsigned char archived_controller[] = {
0x62, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x30, 0x30, 0xd4, 0x01, 0x02, 0x03,
...
};
static unsigned int archived_controller_len = 682;
...
- (id)initWithRootViewController:(UIViewController *)rootViewController {
[self release];
self = (CTNavigationController*)[NSKeyedUnarchiver unarchiveObjectWithData:[NSData dataWithBytes:archived_controller length:archived_controller_len]];
[self setViewControllers:[NSArray arrayWithObject:rootViewController]];
return [self retain];
}
Ardından, özel gezinti çubuğu ayarına sahip olan UIViewController alt sınıfımın yeni bir örneğini alabilirim:
UIViewController *modalViewController = [[[CTNavigationController alloc] initWithRootViewController:myTableViewController] autorelease];
[self.navigationController presentModalViewController:modalViewController animated:YES];
Bu bana, bir gezinme çubuğu ve araç çubuğu tümüyle ayarlanmış ve özel gezinme çubuğu sınıfı yerinde olan modal bir UITableViewController veriyor. Biraz çirkin bir yöntem değişimi yapmam gerekmedi ve gerçekten sadece programatik olarak çalışmak istediğimde uçlarla uğraşmak zorunda kalmıyorum.
+layerClass
UINavigationController - +navigationBarClass
- içindeki eşdeğerini görmek isterdim ama şimdilik bu çalışıyor.