自定义UIBarButtonItem

时间:2012-06-12 21:00:33

标签: iphone objective-c uinavigationcontroller uinavigationbar uibarbuttonitem

我想要添加到导航栏上的自定义按钮。所以这是我到目前为止的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.rightBarButtonItem替换self.navigationItem.rightBarButtonItem之后,它工作了。这是为什么?我的rootviewcontroller属于UIViewController类型,我应该通过navigationItems访问navigationController。在这种情况下,navigationController是什么?

2 个答案:

答案 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 属性 导航项目。