添加imageView和navBar tintColor之间的联系?

时间:2011-08-22 14:14:02

标签: iphone objective-c xcode uiviewcontroller uinavigationcontroller

这真的很奇怪,我似乎无法解释这一点。花了我几个小时才意识到只有当我在ViewController viewDidLoad中将我的self.view添加UIImageView作为子视图时,我才可以设置导航栏的色调颜色。如果我在init方法中添加UIImageView - 色调颜色对我的导航栏没有任何作用。

因此...

在这种情况下,我的导航栏获得了色调颜色:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
    // Custom initialization
}
return self;
}


- (void)viewDidLoad
{
[super viewDidLoad];

//NAV BAR COLOR  
self.navigationController.navigationBar.tintColor = [UIColor blueColor];

//ADDING BACKGROUND IMAGE 
UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
imgView.image = [UIImage imageNamed:@"aaa.png"];
[self.view addSubview: imgView];
[self.view sendSubviewToBack:imgView];

}

这里没有(只是将图像添加到init方法):

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
  //ADDING BACKGROUND IMAGE 
UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
imgView.image = [UIImage imageNamed:@"aaa.png"];
[self.view addSubview: imgView];
[self.view sendSubviewToBack:imgView];    }
return self;
}


- (void)viewDidLoad
{
[super viewDidLoad];

//NAV BAR COLOR  
self.navigationController.navigationBar.tintColor = [UIColor blueColor];

}

这就是我称之为观点的方式:

Login *loginViewController = [[Login alloc] initWithNibName:nil bundle:nil];
UINavigationController *navCntrl1 = [[UINavigationController alloc] initWithRootViewController:loginViewController];
[self presentModalViewController:navCntrl1 animated:YES];

知道为什么吗?我很困惑......谢谢!!

1 个答案:

答案 0 :(得分:1)

这与您的图像无关,而是与UINavigationControllers的创建方式有关。

这是您的代码(添加了一些评论):

// Create the view controller
Login *loginViewController = [[Login alloc] initWithNibName:nil bundle:nil];

// Create a navigation controller and add it
UINavigationController *navCntrl1 = [[UINavigationController alloc] initWithRootViewController:loginViewController];
第一次ui需要了解视图控制器的视图时,会调用

viewDidLoad。如果您的viewDidLoad方法想要编辑导航控制器的功能,则必须在调用viewDidLoad之前将您的视图控制器添加到导航控制器。

在您的第一个示例中,当您将视图控制器添加到导航控制器(上面的第二行)时,调用了viewDidLoad

在您的第二个示例中,当您在viewDidLoad方法中说self.view时,系统调用了initWithNibNamed:bundle:。至关重要的是,在您的视图控制器知道它将被添加到导航控制器之前,这是。因此,当您说self.navigationController时,它将不知道您正在谈论哪个导航控制器。它无法设置它不知道的东西的色调!

在您的第一个示例中,{/ 1>在之后被称为您已将视图控制器添加到导航控制器中,因此当您说viewDidLoad它知道您正在谈论哪个导航控制器时关于并可以相应地设置色调。

要自行测试,请将self.navigationController放入NSLog(@"%@", self.navigationController);方法中 - 我打赌它会为第二个示例输出viewDidLoad;)


仅供参考:

你应该总是做第一个例子 - 它只会在需要时创建图像,并允许你在内存不足的情况下卸载图像。