Saya menunjukkan tampilan modal yang merupakan UITableViewController
kelas. Untuk beberapa alasan itu tidak akan menampilkan bilah navigasi ketika saya menunjukkannya. Ini kode saya:
SettingsCreateAccount *detailViewController = [[SettingsCreateAccount alloc] initWithStyle:UITableViewStyleGrouped];
detailViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
detailViewController.navigationController.navigationBarHidden = NO;
[self.navigationController presentModalViewController:detailViewController animated:YES];
detailViewController = nil;
[detailViewController release];
Saya pikir itu ditampilkan secara default? Jika membantu, saya memanggil ini dari kelas lain yang juga UITableViewController
dikelola oleh a UINavigationController
. Ide ide?
sumber
Berikut adalah salah satu cara untuk menampilkan bilah navigasi bagi mereka yang menggunakan papan cerita, disarankan oleh Tutorial Apple di Papan Cerita .
Karena pengontrol tampilan modal tidak ditambahkan ke tumpukan navigasi, ia tidak mendapatkan bilah navigasi dari pengontrol navigasi pengontrol tampilan tabel. Untuk memberikan bilah navigasi pada pengontrol tampilan saat disajikan secara sederhana, sematkan di pengontrol navigasinya sendiri.
sumber
Di iOS 7 dan Anda hanya ingin bilah navigasi di pengontrol tampilan modal Anda menampilkan judul dan beberapa tombol? Coba keajaiban ini di UITableViewController Anda:
// 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]; }
sumber
[self.view bringSubviewToFront:self.navigationBar];
di akhir-(void)layoutNavigationBar
.Saya ingin berbagi bagaimana solusi yang diterima dapat digunakan dalam proyek dengan papan cerita:
Pendekatan sederhananya adalah dengan meletakkan pengontrol navigasi kosong storyboard sebelum VC yang akan disajikan secara sederhana, sehingga hubungannya terlihat seperti:
Kami telah mencoba pendekatan ini untuk sementara waktu dan menemukan bahwa storyboard kami menjadi "tercemar" oleh sejumlah besar pengontrol navigasi perantara saat masing-masing! dari mereka digunakan secara eksklusif untuk satu! presentasi dari beberapa pengontrol lain, yang kami ingin disajikan secara sederhana dengan bilah navigasi.
Solusi kami saat ini adalah merangkum kode dari jawaban yang diterima ke segmen khusus:
#import "ModalPresentationWithNavigationBarSegue.h" @implementation ModalPresentationWithNavigationBarSegue - (void)perform { UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:self.destinationViewController]; [self.sourceViewController presentViewController:navigationController animated:YES completion:nil]; } @end
Memiliki segue ini dalam proyek kami, kami tidak membuat pengontrol navigasi perantara di storyboard kami lagi, kami hanya menggunakan ModalPresentationWithNavigationBarSegue ini seperti:
Saya berharap jawaban ini akan bermanfaat bagi orang-orang yang suka menghindari duplikasi yang tidak perlu di papan cerita aplikasi mereka.
sumber
Jika Anda hanya membutuhkan
NavigationBar
, Anda dapat menambahkan instance dariUINavigationBar
dan menetapkan BarItems ke dalamnya.sumber
Saya hanya ingin menambahkan sesuatu pada apa yang dikatakan @Scott. Jawabannya jelas merupakan cara termudah dan paling diterima untuk melakukannya sekarang dengan Storyboards, iOS 7 dan 8 ... (dan segera, 9).
Pasti menambahkan pengontrol tampilan ke Storyboard dan Menyematkannya seperti yang dijelaskan oleh @Scott adalah cara yang tepat.
Kemudian, cukup tambahkan segue dengan menggeser kontrol dari pengontrol tampilan sumber ke target (yang ingin Anda tampilkan secara sederhana), pilih "Present Modally" saat tampilan kecil muncul dengan pilihan untuk jenis segue. Mungkin bagus untuk memberinya nama juga (dalam contoh di bawah ini saya menggunakan "presentMyModalViewController").
Satu hal yang saya butuhkan yang hilang adalah kasus @ Scott adalah ketika Anda ingin benar-benar meneruskan beberapa data ke pengontrol tampilan yang disajikan secara sederhana yang tertanam di pengontrol navigasi.
Jika Anda mengambil segue.destinationViewController, itu akan menjadi UINavigationController, bukan pengontrol yang Anda sematkan di UINavigationController.
Jadi, untuk mendapatkan pengontrol tampilan tertanam di dalam pengontrol navigasi, inilah yang saya lakukan:
- (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!"; } }
Semoga ini membantu!
sumber