iPhone:使用导航栏显示模态UITableViewController

Nic*_*ard 86 iphone objective-c uitableview ios

我正在展示一个UITableViewController类的模态视图.出于某种原因,当我显示它时,它不会显示导航栏.这是我的代码:

SettingsCreateAccount *detailViewController = [[SettingsCreateAccount alloc] initWithStyle:UITableViewStyleGrouped];
    detailViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    detailViewController.navigationController.navigationBarHidden = NO;
    [self.navigationController presentModalViewController:detailViewController animated:YES];
    detailViewController = nil;
    [detailViewController release];
Run Code Online (Sandbox Code Playgroud)

我以为它是默认显示的?如果它有帮助,我从另一个同样UITableViewController由a管理的类中调用它UINavigationController.想法?

Bol*_*ock 143

当您呈现模态视图控制器时,它不使用任何现有的导航控制器或导航栏.如果您只想显示导航栏,则需要将导航栏添加为模态视图的子视图,并将其显示为您正在执行的操作.

如果要呈现具有导航功能的模态视图控制器,则需要提供包含详细视图控制器的模态导航控制器,如下所示:

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

navController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentModalViewController:navController animated:YES];
[navController release];
Run Code Online (Sandbox Code Playgroud)

您的模态控制器将管理自己的导航堆栈.

  • 如果您使用故事板,则根本不需要编码来完成此操作。很好的解决方案! (2认同)

Sco*_*ott 36

这是一种为使用故事板的人显示导航栏的方法,由Apple的故事板教程提供.

由于模态视图控制器未添加到导航堆栈,因此它不会从表视图控制器的导航控制器中获取导航栏.在以模态方式呈现视图控制器时,为其提供导航栏,将其嵌入到自己的导航控制器中.

  1. 在大纲视图中,选择View Controller.
  2. 选择视图控制器后,选择"编辑器">"嵌入">"导航控制器".


mal*_*hal 17

在iOS 7上你只需要一个模态视图控制器上的导航栏来显示标题和一些按钮?在UITableViewController中尝试这个魔术:

// 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];
}
Run Code Online (Sandbox Code Playgroud)

  • 现在你最好将它嵌入导航控制器中. (2认同)

Sta*_*ich 7

我想分享如何在具有故事板的项目中使用已接受的解决方案:

简单的方法是在VC之前放入一个故事板空白导航控制器,它将以模态方式呈现,因此关系看起来像:

(Presenter VC) - >提供modally - >(导航控制器有一个控制器作为其根目录).

我们已经尝试了这种方法一段时间,并注意到我们的故事板被大量的这样的中间导航控制器"污染"了!它们专门用于一个!介绍一些其他控制器,我们希望以导航栏的形式呈现.

我们当前的解决方案是将接受的答案中的代码封装到自定义segue中:

#import "ModalPresentationWithNavigationBarSegue.h"

@implementation ModalPresentationWithNavigationBarSegue

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

    [self.sourceViewController presentViewController:navigationController animated:YES completion:nil];
}
@end
Run Code Online (Sandbox Code Playgroud)

在我们的项目中有这个segue我们不再在我们的故事板中创建中间导航控制器,我们只是使用这个ModalPresentationWithNavigationBarSegue,如:

演示者VC - > Presentee VC

我希望这个答案对那些喜欢避免在应用程序故事板中出现不必要重复的人有所帮助.


xha*_*han 5

如果您只需要a NavigationBar,则可以添加一个实例UINavigationBar并为其分配BarItems.


Eva*_*one 5

我只想在@Scott所说的内容中添加一些内容.他的回答绝对是现在使用Storyboard,iOS 7和8 ...(很快,9)的最简单和最被接受的方式.

绝对将视图控制器添加到故事板并按照@Scott的描述嵌入它是正确的方法.

然后,只需通过控制拖动从源视图控制器添加segue到目标(要以模态方式显示的目标),当出现小视图时,选择"存在模态",并选择segue类型.可能也很好给它一个名字(在下面的例子中我使用"presentMyModalViewController").

我需要的一件事就是缺少的是@Scott的情况是当你想要将一些数据实际传递给嵌入在导航控制器中的模态呈现的视图控制器时.

如果你抓住segue.destinationViewController,它将是一个UINavigationController,而不是你嵌入在UINavigationController中的控制器.

因此,要获得导航控制器内的嵌入式视图控制器,这就是我所做的:

- (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!";
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!