2012-12-12 52 views
0

爲什麼這不起作用?我想sublcass UINavigationBar的所以在Xcode我點擊新的文件 - >目標C類, 類:CustomNavBar 子類:UINavigationBar的iOS:如何繼承UINavigationBar

導航控制器的場景下的故事板

然後,我點擊導航欄,並設置它的類到CustomNavBar。

然後我進入我的CustomNaVBar類並嘗試添加自定義圖像背景。

在initWithFram方法我已經加入這個:

- (id)initWithFrame:(CGRect)frame 
{ 
    NSLog(@"Does it get here?"); //no 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
     UIImage *image = [UIImage imageNamed:@"customNavBarImage.png"]; 
     // [self setBackgroundImage:image forBarMetrics:UIBarMetricsDefault]; 
     [self setBackgroundColor:[UIColor colorWithPatternImage:image]]; 
     [[UINavigationBar appearance] setBackgroundImage:image forBarMetrics:UIBarMetricsDefault]; 
     NSLog(@"Does this get called?"); //no 
    } 
    return self; 
} 

我沒有看到在控制檯上的任何輸出。

相反,我已經這樣做了自定義UINavBar,但我覺得它不像子分類那樣正確。在我的第一個觀點的viewDidLoad我加入這一行:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    if ([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) { 
     UIImage *image = [UIImage imageNamed:@"customNavBarImage.png"]; 
     [self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault]; 
    } 
} 
+0

在'init'方法或'layoutSubviews'方法中添加該方法。它應該工作。 – iDev

+0

那麼,我總是隻使用viewDidLoad。似乎子類化對於設置背景圖像來說相當有用。 – Josiah

回答

2

我同意瑞恩佩裏。除了他的回答:

你不應該把這個代碼initWithFrame,而不是把你的代碼中awakeFromNib

- (void) awakeFromNib { 
    // Initialization code 
    UIImage *image = [UIImage imageNamed:@"customNavBarImage.png"]; 
    // [self setBackgroundImage:image forBarMetrics:UIBarMetricsDefault]; 
    [self setBackgroundColor:[UIColor colorWithPatternImage:image]]; 
    [[UINavigationBar appearance] setBackgroundImage:image forBarMetrics:UIBarMetricsDefault]; 
    NSLog(@"Does this get called?"); //YES!! 
} 
1

根據對initWithFrame的文檔:

如果您使用Interface Builder來設計自己的界面,這種方法是叫當你的看法對象隨後從nib文件加載。 nib文件中的對象被重構,然後使用其initWithCoder:方法進行初始化,該方法修改視圖的屬性以匹配存儲在nib文件中的屬性。有關如何從nib文件加載視圖的詳細信息,請參閱資源編程指南。

http://developer.apple.com/library/ios/#documentation/uikit/reference/uiview_class/uiview/uiview.html

這將是該方法不歌廳叫像你期望它的原因。

0

你也可以繼承的UINavigation條如下:

@interface CustomNavigationBar : UINavigationBar 

@end 

@implementation CustomNavigationBar 

- (void)drawRect:(CGRect)rect 
{  
    //custom draw code 
} 

@end 

//Begin of UINavigationBar background customization 
@implementation UINavigationBar (CustomImage) 

//for iOS 5 
+ (Class)class { 
    return NSClassFromString(@"CustomNavigationBar"); 
} 

@end 
1

你必須使用initWithCoder:方法,因爲從Storyboard加載UI對象時,它是指定的初始化程序。因此,使用此代碼:

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    NSLog(@"Does it get here?"); // now it does! 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     // Initialization code 
     // ... 
     NSLog(@"Does this get called?"); // yep it does! 
    } 
    return self; 
}