我正在使用Xcode 4.6.1在Objective-C上进行编码。我想知道当我在2个View控制器之间创建模态segue时如何保持导航栏显示,因为我在故事板中执行segue,当我运行应用程序时,第二个视图控制器的导航栏消失了,我在那个酒吧上有一个完成按钮,但我看不到它。
答案 0 :(得分:81)
只需将另一个Navigation Controller
添加到模态视图控制器即可。按照步骤
Modal View Controller
Editor menu
Embed In
Navigation Controller
运行该应用程序。现在它应该完美地工作。
希望这能解决你的问题。
答案 1 :(得分:57)
模态segue占据整个屏幕,因此呈现控制器中的任何导航栏,工具栏或标签栏都将被掩盖。如果您想在此模态控制器上使用导航栏,则需要专门为其添加一个导航栏,并将所需的任何按钮添加到该新导航栏(或工具栏)。如果您不想这样做,那么不要以模态方式呈现它,请按下它。
答案 2 :(得分:14)
您只需执行以下操作即可显示导航栏:
<强>目标C 强>
v-if="product.gender == gender"
SWIFT 3
UINavigationController alloc]initWithRootViewController:modalVC];
这将显示带导航栏的模态视图控制器。 关于Objective-C的知识是有限的,所以我没有写出演示的部分。你应该能够找到一个。 ;)
希望这有帮助!
答案 3 :(得分:10)
在iOS 8中有一种更好的方法。您可以使用自适应演示样式:
目标-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)
}
}
在准备segue方法时设置委托:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if let adpostVC = segue.destinationViewController as? XXXController {
let popPC = adpostVC.popoverPresentationController
popPC?.delegate = self
答案 4 :(得分:5)
swift版本:
按照步骤:
覆盖prepareForSegue()
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "goToYourController" {
let navigation: UINavigationController = segue.destinationViewController as! UINavigationController
var vc = YourViewController.init()
vc = navigation.viewControllers[0] as! YourViewController
//if you need send something to destnation View Controller
//vc.delegate = self
}
}
答案 5 :(得分:4)
有一种更简单的方法可以做到这一点。像之前的评论说的那样(但没有解释所有步骤)您需要在导航控制器中嵌入您想要的目标视图控制器,然后将目标视图控制器设置为导航控制器,然后导航控制器调用目标视图控制器。
首先,将VC嵌入NavVC。 然后,您必须编写代码以将segue目标设置为Nav VC。
代码如下所示:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
UINavigationController *nav = segue.destinationViewController;
AddTriviaVC *triv = [[AddTriviaVC alloc]init];
triv = nav.viewControllers[0];
triv.location = self.location;
}
我希望这是有道理的。
答案 6 :(得分:1)
这可能是因为你的模态中没有UINavigationController
。你应该使用一个(或者只是在故事板中为你的ViewController添加一个导航栏),并以模态方式呈现。
答案 7 :(得分:1)
答案 8 :(得分:0)
您可以通过在-(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];
}
这应该可以为您提供模态视图控制器所需的功能。
答案 9 :(得分:0)
这是我在Swift 4.2中“ Volodymyr Nazarkevych”的简写版本
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
super.prepare(for: segue, sender: sender)
switch(segue.identifier ?? "") {
case "segueIdentifier": // name of your segue
let navigation: UINavigationController = segue.destination as! UINavigationController
//here you create new name of your destination ViewController and assign his name to let constant above
guard let myNewViewController = navigation.viewControllers[0] as? DestinationViewController
//DestinationViewController is your 2-ViewController where you go to from first one.
else {
fatalError("Unexpected destination: \(segue.destination)")
}
// TO DO SOMETHING HERE
default:
fatalError("Unexpected Segue Identifier; \(String(describing: segue.identifier))")
}
}
“ Volodymyr Nazarkevych”的代码可以完美地工作,但是仅当您的选择是从1-ViewController到2-ViewController的NavigationController而不是直接到2-ViewController时。谢谢!!
在目标块代码之后的切换情况下,您也可以做其他事情,例如从第二个ViewController获取一些信息或文件。
答案 10 :(得分:0)