iPhone: Gezinme çubuğuyla kalıcı UITableViewController'ı gösterin


87

Bir UITableViewControllersınıf olan modal bir görünüm gösteriyorum . Bazı nedenlerden dolayı, onu gösterdiğimde gezinme çubuğunu göstermiyor. İşte kodum:

SettingsCreateAccount *detailViewController = [[SettingsCreateAccount alloc] initWithStyle:UITableViewStyleGrouped];
    detailViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    detailViewController.navigationController.navigationBarHidden = NO;
    [self.navigationController presentModalViewController:detailViewController animated:YES];
    detailViewController = nil;
    [detailViewController release];

Varsayılan olarak gösterildiğini sanıyordum? Yardımı dokunursa, bunu aynı zamanda a UITableViewControllertarafından yönetilen başka bir sınıftan arıyorum UINavigationController. Fikirler?

Yanıtlar:


146

Bir modal görünüm denetleyicisi sunduğunuzda, mevcut gezinme denetleyicilerini veya gezinme çubuklarını kullanmaz. Tek istediğiniz bir gezinme çubuğu görüntülemekse, gezinme çubuğunu kalıcı görünümünüzün bir alt görünümü olarak eklemeniz ve yaptığınız gibi sunmanız gerekir.

Gezinme işlevine sahip bir modal görünüm denetleyicisi sunmak istiyorsanız, bunun yerine ayrıntı görünümü denetleyicinizi içeren bir modsal gezinme denetleyicisi sunmanız gerekir, örneğin:

SettingsCreateAccount *detailViewController = [[SettingsCreateAccount alloc] initWithStyle:UITableViewStyleGrouped];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:detailViewController];
[detailViewController release];

navController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentModalViewController:navController animated:YES];
[navController release];

Modal denetleyiciniz kendi gezinme yığınını yönetecektir.


Teşekkürler, açıklamayı takdir ediyorum, böylece neyi yanlış yaptığımı biliyorum.
Nic Hubbard

1
Bir storyboard kullanıyorsanız, bunu başarmak için hiçbir kodlama yoktur. Güzel çözüm!
Jelle

36

Apple'ın Storyboard'daki Öğreticisi tarafından önerilen, storyboard kullananlar için gezinme çubuğunu görüntülemenin bir yolu .

Modal görünüm denetleyicisi gezinme yığınına eklenmediğinden, tablo görünümü denetleyicisinin gezinme denetleyicisinden bir gezinme çubuğu almaz. Mod olarak sunulduğunda görünüm denetleyicisine bir gezinme çubuğu vermek için, bunu kendi gezinme denetleyicisine yerleştirin.

  1. Anahat görünümünde Denetleyiciyi Görüntüle'yi seçin.
  2. Görünüm denetleyicisi seçiliyken Düzenleyici> Yerleştir> Gezinme Denetleyicisi'ni seçin.

Modal
segmenti

Twitter'ın kullanıcı profilini düzenleme sayfası durumunda. Bu mod olarak sunulan bir UITableViewController'dır ve üstte DONE ve CANCEL düğmelerine sahiptir. Bu cevap, bu durumda anlamsal olarak hiçbir anlam ifade etmiyor çünkü gezinme gerçekleşmiyor.
William Entriken

17

İOS 7'de ve modal görünüm denetleyicinizde bir başlık ve bazı düğmeler göstermek için bir gezinme çubuğu mu istiyorsunuz? Bu sihri UITableViewController cihazınızda deneyin:

// in the .h
@property (strong) UINavigationBar* navigationBar;

//in the .m
- (void)viewDidLoad {
    [super viewDidLoad];

    self.navigationItem.title = @"Awesome";
    self.navigationBar = [[UINavigationBar alloc] initWithFrame:CGRectZero];
    [self.view addSubview:_navigationBar];
    [self.navigationBar pushNavigationItem:self.navigationItem animated:NO];
}

-(void)layoutNavigationBar{
    self.navigationBar.frame = CGRectMake(0, self.tableView.contentOffset.y, self.tableView.frame.size.width, self.topLayoutGuide.length + 44);
    self.tableView.contentInset = UIEdgeInsetsMake(self.navigationBar.frame.size.height, 0, 0, 0);
}

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
    //no need to call super
    [self layoutNavigationBar];
}

-(void)viewDidLayoutSubviews{
    [super viewDidLayoutSubviews];
    [self layoutNavigationBar];
}

Bir şeyler yapmanın harika bir yolu gibi görün. ancak bunu bir Static UITableViewController üzerinde denediğimde, artık tablo görünümünü kaydıramıyorum. herhangi bir fikriniz neden?
Thomas Besnehard

2
günümüzde onu bir gezinti denetleyicisine yerleştirseniz daha iyi olur.
malhal

Bu güzel bir çözüm, ancak küçük bir sorun, hücre başlığı başlıklarının gezinme çubuğunun üstünde gösterilmesidir.
Ali

[self.view bringSubviewToFront:self.navigationBar];Sonuna ekleyerek çözdüm -(void)layoutNavigationBar.
Ali

7

Kabul edilen çözümün projelerde nasıl kullanılabileceğini storyboard'larla paylaşmak istiyorum:

Basit yaklaşım, modsal olarak sunulacak VC'nin önüne bir storyboard boş gezinme denetleyicisi koymaktır, böylece ilişkiler şöyle görünür:

(Sunucu VC) -> modsal olarak sunar -> (kök olarak sunulacak bir denetleyiciye sahip gezinme denetleyicisi).

Bu yaklaşımı bir süredir denedik ve görsel senaryolarımızın çok sayıda bu tür ara gezinme denetleyicileri tarafından "kirlendiğini" fark ettik! bunlardan sadece biri için kullanılıyor! gezinti çubuğu ile mod olarak sunulmasını istediğimiz başka bir denetleyicinin sunumu.

Mevcut çözümümüz, kodu kabul edilen yanıttan özel bir segmente kadar kapsamaktır:

#import "ModalPresentationWithNavigationBarSegue.h"

@implementation ModalPresentationWithNavigationBarSegue

- (void)perform {
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:self.destinationViewController];

    [self.sourceViewController presentViewController:navigationController animated:YES completion:nil];
}
@end

Projemizde bu segmente sahip olarak artık storyboardlarımızda ara gezinme denetleyicileri oluşturmuyoruz, sadece bu ModalPresentationWithNavigationBarSegue gibi kullanıyoruz:

Presenter VC -> Presentee VC

Umarım bu yanıt, uygulama storyboard'larında gereksiz yinelemelerden kaçınmak isteyen kişilere yardımcı olur.


5

Yalnızca bir NavigationBaröğesine ihtiyacınız varsa, UINavigationBarBarItems örneğini ekleyebilir ve ona atayabilirsiniz.


Bu ViewController'a bağlıdır: Bir UITableViewController'a bir UINavigationBar ekleyemeyeceğinizi düşünüyorum, değil mi?
Tobias

IB'de, Düzenleyici -> Gezinme Denetleyicisine Yerleştir'e gidin ve bir Gezinme Çubuğunuz olacak. BarButtonItems'i sürükleyin ve buna ekleyin.
AmitaiB

5

@Scott'un söylediklerine bir şey eklemek istedim. Cevabı, Storyboard'lar, iOS 7 ve 8 ... (ve yakında 9) ile bunu yapmanın kesinlikle en kolay ve en çok kabul gören yolu.

Storyboard'a kesinlikle bir görünüm denetleyicisi eklemek ve @ Scott tarafından açıklandığı gibi yerleştirmek doğru yoldur.

Ardından, kaynak görünüm denetleyicisinden hedefe (mod olarak göstermek istediğiniz) kontrol-sürükleyerek segmenti ekleyin, segment türü seçenekleriyle birlikte küçük görünüm göründüğünde "Modsal Olarak Sun" u seçin. Muhtemelen bir isim vermek de iyidir (aşağıdaki örnekte "presentMyModalViewController" kullanıyorum).

Eksik olan bir şey, @ Scott'ın durumu, gezinti denetleyicisine gömülü olan mod olarak sunulan görünüm denetleyicisine gerçekten bazı verileri aktarmak istediğiniz zamandır.

Segue.destinationViewController'ı alırsanız, bu UINavigationController'a katıştırdığınız denetleyici değil, bir UINavigationController olacaktır.

Dolayısıyla, gezinme denetleyicisinin içindeki yerleşik görünüm denetleyicisine ulaşmak için yaptığım şey:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"presentMyModalViewController"]) {
        // This could be collapsed, but it's a little easier to see
        // what's going on written out this way.

        // First get the destination view controller, which will be a UINavigationController
        UINavigationController *nvc = (UINavigationController *)segue.destinationViewController;

        // To get the view controller we're interested in, grab the navigation controller's "topViewController" property
        MyModalViewController *vc = (EmailReceiptViewController *)[nvc topViewController];

        // Now that we have the reference to our view controller, we can set its properties here:
        vc.myAwesomeProperty = @"awesome!";
    }
}

Bu yardımcı olur umarım!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.