Xcode 4.6.1 を使用して Objective-C でコーディングしています。ストーリーボードでセグエを実行していて、アプリケーションを実行すると 2 番目のビュー コントローラーのナビゲーション バーが消えてしまうため、2 つのビュー コントローラー間でモーダル セグエを作成するときにナビゲーション バーを表示したままにする方法を知りたいです。そのバーに完了ボタンがありますが、表示されません。
11 に答える
Navigation Controller
モーダルView Controllerに別のものを追加するだけです。手順に従ってください
- を選択
Modal View Controller
- に行く
Editor menu
- 選択する
Embed In
- 選択する
Navigation Controller
アプリケーションを実行します。これで完全に動作するはずです。
これで問題が解決することを願っています。
モーダル セグエは画面全体を占有するため、表示側コントローラーにあるナビゲーション バー、ツールバー、またはタブ バーは隠されます。このモーダル コントローラーにナビゲーション バーが必要な場合は、専用のコントローラーを追加し、必要なボタンをその新しいナビゲーション バー (またはツールバー) に追加する必要があります。これをしたくない場合は、モーダルに提示せず、プッシュしてください。
ナビゲーション バーを表示するには、次のようにします。
Objective-C
UINavigationController alloc]initWithRootViewController:modalVC];
スイフト3
let modelVC = self.storyboard?.instantiateViewController(withIdentifier: "modalVC") as! ModalVC
let navBarOnModal: UINavigationController = UINavigationController(rootViewController: modalVC)
self.present(navBarOnModal, animated: true, completion: nil)
これにより、モーダル ビュー コントローラーとナビゲーション バーが表示されます。Objective-C に関する知識は限られているため、プレゼンテーションの部分は書きませんでした。あなたはそれを理解できるはずです。;)
お役に立てれば!
iOS 8 では、より良い方法があります。アダプティブ プレゼンテーション スタイルを使用できます。
- 「Present as popover」セグエを使用する
- UIPopoverPresentationControllerDelegate プロトコルを採用するようにコントローラーを設定します
- 2つの方法を実装する
目的 C:
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {
return UIModalPresentationFullScreen;
}
- (UIViewController *)presentationController:(UIPresentationController *)controller viewControllerForAdaptivePresentationStyle:(UIModalPresentationStyle)style {
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController: controller.presentedViewController];
return navController;
}
迅速:
UIPopoverPresentationControllerDelegate
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
return UIModalPresentationStyle.FullScreen
}
func presentationController(controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? {
var navController = UINavigationController(rootViewController: controller.presentedViewController)
return navController
}
スウィフト 4:
extension MyViewController: UIPopoverPresentationControllerDelegate {
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
return UIModalPresentationStyle.fullScreen
}
func presentationController(_ controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? {
return UINavigationController(rootViewController: controller.presentedViewController)
}
}
セグエ メソッドの準備で、デリゲートを設定します。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if let adpostVC = segue.destinationViewController as? XXXController {
let popPC = adpostVC.popoverPresentationController
popPC?.delegate = self
There is an easier way to do this. Like previous comments said (but didn't explain all the steps) you need to embed your desired destination view controller in a navigation controller, then set your destination view controller to be the Navigation Controller, then the Navigation controller calls the destination view controller.
First, embed the VC in a NavVC. Then you must write the code to set the segue destination to be the Nav VC.
The code looks like this:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
UINavigationController *nav = segue.destinationViewController;
AddTriviaVC *triv = [[AddTriviaVC alloc]init];
triv = nav.viewControllers[0];
triv.location = self.location;
}
I hope this makes sense.
UINavigationController
これはおそらく、モーダルに a がないためです。いずれかを使用し (または、ストーリーボードの ViewController にナビゲーション バーを追加するだけ)、それをモーダルに提示する必要があります。
で次の操作を行うことにより、プログラムでツールバーを追加できます。-(void)viewDidLoad
NSInteger tbHeight = 50;
tb = [[UIToolbar alloc] initWithFrame:CGRectMake(0, (self.view.frame.size.height - tbHeight), self.view.frame.size.width, tbHeight)];
tb.translucent = YES;
emailButton = [[UIBarButtonItem alloc] initWithTitle:@"Email Results" style:UIBarButtonItemStyleBordered target:tvController action:@selector(actionSheet:)];
UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleBordered target:self action:@selector(doneButtonPressed:)];
NSArray *barButton = [[NSArray alloc] initWithObjects:emailButton,flexibleSpace,doneButton,nil];
[tb setItems:barButton];
[self.view addSubview:tb];
barButton = nil;
次に、完了ボタンを押すための IBAction を作成する必要があります。これは次のように行われます。
-(IBAction)doneButtonPressed:(id)sender {
[self dismissModalViewControllerAnimated:YES];
}
これにより、モーダルビューコントローラーで必要なものが得られるはずです。