Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 定制uibarbuttonim_Iphone_Objective C_Uinavigationcontroller_Uinavigationbar_Uibarbuttonitem - Fatal编程技术网

Iphone 定制uibarbuttonim

Iphone 定制uibarbuttonim,iphone,objective-c,uinavigationcontroller,uinavigationbar,uibarbuttonitem,Iphone,Objective C,Uinavigationcontroller,Uinavigationbar,Uibarbuttonitem,我想在导航栏上添加一个自定义按钮。下面是我目前在RootViewController中所拥有的内容(它继承了UIViewController,通过AppDelegate添加了UINavigationController): 在viewDidLoad中: UIBarButtonItem *share = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"icon"] style:UIBarButtonItemStylePlai

我想在导航栏上添加一个自定义按钮。下面是我目前在
RootViewController
中所拥有的内容(它继承了
UIViewController
,通过
AppDelegate
添加了
UINavigationController
):

viewDidLoad
中:

UIBarButtonItem *share = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"icon"] style:UIBarButtonItemStylePlain target:self action:@selector(share:)];
self.navigationController.navigationItem.rightBarButtonItem = share;
以下是my
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.RightBarButtonim
替换为
self.navigationItem.RightBarButtonim
后,它就工作了。为什么呢?我的rootviewcontroller属于
UIViewController
类型,我应该通过
navigationController
访问
navigationItems
。在这种情况下,
navigationController
是什么

在我将self.navigationController.navigationItem.RightBarButtonim替换为self.navigationItem.RightBarButtonim后,它工作了。为什么呢

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

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

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

在这种情况下,navigationController是什么

navigationController
是对当前包含由
self
表示的视图控制器的UINavigationController的引用

例如:

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

// This is TRUE: viewController.navigationController == navController
通过更新导航栏,声明

  • 如果新的顶级视图控制器具有自定义左栏按钮
    项目,将显示该项目。指定自定义左栏按钮的步骤
    项,设置视图控制器的
    导航项

  • 如果新的顶级视图控制器具有自定义右栏按钮
    项目,将显示该项目。指定自定义右栏按钮的步骤
    项,设置视图控制器的
    导航项


好的,因此每个
UIViewController
都包含使用proeprty
navigationController
的对其导航控制器的引用。但是
navigationItem
UIViewController
的属性,而不是
UINavigationController
UINavigationController继承它,因为它是
UIViewController的子类)。我想这可能是一个常见的误解,
navigationItem
UINavigationController
的属性。还有一个问题,那么如果ViewController没有导航栏,那么将其改为
UINavigationController
属性是否更有意义呢?视图控制器不拥有导航栏,导航控制器拥有导航栏。想象一下,如果导航控制器有一个导航项。这意味着每次出现一个视图控制器时,都必须显式重置导航项属性。因此视图控制器具有某种指向导航栏的
指针?如果视图控制器不拥有它,那么为什么
navigationItem
是视图控制器的属性?视图控制器和导航项之间的关系是什么?弱指针?