2011-08-03 71 views
2

我想要做的是一個帶有圖像的導航欄。我在我的主視圖上有一個選項卡控制器,並且在每個選項卡內有一個UINavigationController。從我的標籤/ navigationController調用的UIViewController裏面,我可以設置於titleview沒有太多問題,這樣viewDidLoad方法中:覆蓋UINavigationBar以設置默認標題查看

self.navigationItem.titleView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"mylogo.png"]] autorelease]; 

但是,我想,以取代所有冠軍,在我的導航欄的這一觀點,並在任何地方重複這一點似乎都很難。所以我對代表做了這個(鏈接所有Outlet的東西后)

self.tabOneNavController.navigationBar.topItem.titleView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"mylogo.png"]] autorelease]; 

再次,它的工作!好的,我快到了。 但重點是,我有5個選項卡,他們都有navigationControllers裏面。我將每個內部視圖的代碼重複次數減少到僅5次,但仍然如此。它要求我爲每個選項卡的NavController執行此操作。

然後我試圖擴展UINavigationBar來創建我自己的,我可以在初始化程序中設置它,並在界面生成器中將它用作對象類。但它似乎並不奏效。這裏是我做的:

@implementation MyNavigationBar 

- (id)init { 
    self = [super self]; 

    self.tintColor = [UIColor greenColor]; 
    self.topItem.title = @"testing please work"; 

    return self; 
} 

@end 

在接口文件MyNavigationBar繼承自UINavigationBar。但是這不起作用。我應該改寫其他方法嗎?哪一個?這是一個很好的做法嗎? 我甚至不確定是否應該爲每個選項卡添加一個導航欄,正如我所說的,我有選項卡,並且我想要在其中導航欄/導航。到目前爲止,在嘗試瞭解接口構建器/插座和類是如何工作的近乎死亡的經驗之後,代碼正在工作,我只想使其不起作用。

謝謝!

回答

3

你描述的重複代碼的問題有一個優雅的解決方案。 Objective-C支持稱爲「類別」的東西,它允許您將方法添加到類中。一個常用的用途是自定義導航和選項卡欄。在Xcode 4中,您可以按照以下方式在UINavigationBar上添加一個類別:

按下Command + N或打開「新建文件」對話框。接下來,選擇從可可觸摸菜單「的Objective-C類」:

Creating a category

點擊下一步,系統會提示您輸入您想方法添加到作爲一個類別類的名稱。它應該是這個樣子:

Making a Category on the NavBar

然後,你應該保存文件對話框結束。關於這裏的約定的簡要說明。約定是在原始類,加號後面添加一個類別,然後描述您添加的內容。這裏是你的可能是什麼樣子:

Category Naming Convention

一旦您保存文件,您將需要得到的東西是這樣的:

Empty Category

看那個美女。您現在可以覆蓋默認的繪圖/ init方法以及擴展導航欄的功能。

我建議看看initdrawRect方法,但我不記得人們使用哪些方法。另外,請注意,在NDA下,這可能會在iOS 5中發生變化,因此請爲此做好準備。

+0

這工作就像一個魅力,謝謝你!只是一個問題,我在界面生成器中聲明瞭屬於我的類別接口「@property(nonatomic,retain)IBOutlet UIImageView * barTitle;'的屬性,我將它鏈接到了我在那裏的imageview。然後我試着從實現drawRec裏面設置titleView。但它會在應用程序啓動後立即拋出一個錯誤,因爲出口鏈接。無論如何要做到這一點?我只是好奇。我嘗試添加@synthesize,但它表示在一個類別中不可能。 – Tiago

+0

對,類別不是子類。您只能添加方法。你不能添加屬性。 – Moshe

+0

我在想如何做到這一點。甜 – vinylDeveloper

3

爲什麼不定義一個UIViewController子類,它通過self.navigationItem.titleView來設置標題視圖,並讓您的其他視圖控制器從該類繼承?然後,您將在所有控制器中共享該行爲,而不必重複實施。