3

我有一个要添加到导航栏的自定义按钮。所以这就是我到目前为止所拥有的RootViewController(继承UIViewControllerUINavigationController通过添加AppDelegate):

viewDidLoad

UIBarButtonItem *share = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"icon"] style:UIBarButtonItemStylePlain target:self action:@selector(share:)];
self.navigationController.navigationItem.rightBarButtonItem = share;

这是我UINavigationController的设置方式:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.

    UIViewController *rootViewController = [[RootViewController alloc] initWithNibName:nil bundle:nil];
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
    [navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"navbar"] forBarMetrics:UIBarMetricsDefault];
    self.window.rootViewController = navigationController;
    [self.window makeKeyAndVisible];
    return YES;
}

为什么这不起作用?

编辑:

在我替换self.navigationController.navigationItem.rightBarButtonItemself.navigationItem.rightBarButtonItem. 这是为什么?我的 rootviewcontroller 是类型UIViewController,我应该navigationItems通过navigationController. navigationController在这种情况下是什么?

4

2 回答 2

1

在我用 self.navigationItem.rightBarButtonItem 替换 self.navigationController.navigationItem.rightBarButtonItem 后它起作用了。这是为什么?

UIViewController 的每个实例都有一个 navigationItem。这包括 UINavigationController,它是 UIViewController 的子类。

当新的视图控制器出现时,UINavigationController 使用 navigationItem 来更新其视觉状态。修改时self.navigationController.navigationItem,您正在修改嵌套 UINavigationController 时将显示的内容。实际上,您永远不会修改 UINavigationController 的 navigationItem,因为您不会有嵌套的导航控制器。

正如您所发现的,您必须修改视图控制器navigationItem才能使更改在导航控制器中生效。

在这种情况下,navigationController 是什么?

navigationController是对 UINavigationController 的引用,由它表示的视图控制器self当前包含在其中。

例如:

UIViewController* viewController = [[UIViewController alloc] initWithNibName:nil bundle:nil];
UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:viewController];

// This is TRUE: viewController.navigationController == navController
于 2012-06-12T21:54:22.703 回答
-1

根据更新导航栏的Apple UINavigationController 参考,声明

  • 如果新的顶级视图控制器有一个自定义的左栏按钮
    项,则显示该项。要指定自定义左栏按钮
    项,请设置视图控制器 导航项的leftBarButtonItem属性。

  • 如果新的顶级视图控制器具有自定义右栏按钮
    项,则显示该项。要指定自定义右栏按钮
    项,请设置视图控制器 导航项的rightBarButtonItem属性。

于 2012-06-12T22:02:22.143 回答