我想要添加到导航栏上的自定义按钮。所以这是我到目前为止的RootViewController
(继承UIViewController
,UINavigationController
通过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.rightBarButtonItem
替换self.navigationItem.rightBarButtonItem
之后,它工作了。这是为什么?我的rootviewcontroller属于UIViewController
类型,我应该通过navigationItems
访问navigationController
。在这种情况下,navigationController
是什么?
答案 0 :(得分:1)
在我用self.navigationItem.rightBarButtonItem替换self.navigationController.navigationItem.rightBarButtonItem之后,它工作了。那是为什么?
UIViewController的每个实例都有一个navigationItem。这包括UINavigationController,它是UIViewController的子类。
当新的视图控制器出现时,UINavigationController使用 navigationItem来更新其可视状态。修改self.navigationController.navigationItem
时,如果嵌套了UINavigationControllers,则会修改显示的内容。在实践中,您永远不会修改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
答案 1 :(得分:-1)
通过更新导航栏基于Apple UINavigationController reference,声明
如果新的顶级视图控制器有自定义左栏按钮
item,显示该项目。指定自定义左栏按钮
item,设置视图控制器的 leftBarButtonItem 属性
导航项目。
如果新的顶级视图控制器具有自定义右侧栏按钮
item,显示该项目。指定自定义右侧栏按钮
item,设置视图控制器的 rightBarButtonItem 属性
导航项目。