【问题标题】:navigation bar in Detail side of master-detail controller missing缺少主从控制器详细信息侧的导航栏
【发布时间】:2013-11-22 08:59:27
【问题描述】:

我在我的storyboard 中用不同的viewcontrollers 制作了masterdetailview,并用push segue 链接了每一个。现在,当我单击列表项时,新的DetailViewController 打开,但每个都没有navigationbar。我在每个视图的顶部添加了navigation item,为每个视图添加了标题,但毕竟navigation bar 没有显示。我正在开发iPad 应用程序,并且在两个方向上都缺少导航栏。

编辑:

当您创建主从项目时,我的 appDelegate 与模板相同:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
        UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
        UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
        splitViewController.delegate = (id)navigationController.topViewController;
    }

    return YES;
}

我的一个 DetailViewControllers:

#import "MediaExpDetailViewController.h"

@interface MediaExpDetailViewController ()
@property (strong, nonatomic) UIPopoverController *masterPopoverController;
@end

@implementation MediaExpDetailViewController

#pragma mark - Managing the detail item

- (void)setDetailItem:(id)newDetailItem
{
    if (_detailItem != newDetailItem) {
        _detailItem = newDetailItem;
    }
    if (self.masterPopoverController != nil) {
        [self.masterPopoverController dismissPopoverAnimated:YES];
    }
}


- (void)viewDidLoad{

    [super viewDidLoad];
}

#pragma mark - Split view

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
{
    barButtonItem.title = NSLocalizedString(@"MasterButton", @"Master");
    [self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];
    self.masterPopoverController = popoverController;
}

- (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
    // Called when the view is shown again in the split view, invalidating the button and popover controller.
    [self.navigationItem setLeftBarButtonItem:nil animated:YES];
    self.masterPopoverController = nil;
}


@end

【问题讨论】:

  • 您能否添加您在 AppDelegate 和您的控制器之一中所做的代码

标签: ios objective-c ipad storyboard master-detail


【解决方案1】:

您的 DetailViewController 必须连接到 UINavigationController。如果你从 Xcode 的“New Project”菜单中设置一个新的 master-detail-project,你会得到这个:

注意:每个细节视图控制器都必须连接到 UINavigationController(直接或间接)。

编辑: 要连接多个 UINavigationController,请执行以下操作: 您的初始详细视图 UINavigationController 与拆分视图连接(像往常一样)。每个其他细节视图 UINavigationController 都与主视图连接(使用 replace segue):

如果您想让用户切换回初始详细视图,您还必须将初始视图控制器与主控制器连接(因此有两个连接,一个连接到拆分,一个连接到主控)。

要在详细视图控制器之间切换,请在主视图控制器中调用 performSegueWithIdentifier:sender:

编辑 2:

要将您的详细视图添加为拆分视图的委托,请实现以下方法,该方法在 viewDidLoad 之前被调用

- (void)awakeFromNib
{
    self.splitViewController.delegate = self;
}

【讨论】:

  • 我已将每个详细视图与导航控制器连接,请参阅link
  • 这些详细视图中哪些具有 UINavigationController 作为根视图控制器?如果答案是none,那么可能是你的问题。将 UINavigationController 添加到每个 DetailViewController 并将其连接为 根视图控制器
  • 根视图控制器是其中包含图片的视图控制器,其他视图控制器通过push segue链接。只有根视图控制器的导航栏可见。
  • 这正是我所说的......每个视图控制器都必须有一个导航控制器作为其根。在您的情况下,只有一个具有 root 权限,因此只有一个具有导航栏。你必须再创建 9 个 UINavigationControllers。
  • 如果我将 FirstDetailViewController 设置为根视图控制器,而不是尝试将 SecondDetailViewController 设置为根,则第一个 segue 连接被分离! 一次只能有一个根视图控制器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 2012-05-13
  • 2017-04-13
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多