0

我有一個菜單按鈕,它顯示在幾個視圖控制器。使用的代碼添加在UIViewControllerviewDidLoad方法中。正確的方式來resive靜態UIViewController代碼的菜單

而不是重新使用下面相同的鍋爐板代碼。

self.menuButtonItem.title = @"Menu2"; 
self.menuButtonItem.target = (MESMainNavigationController *)self.navigationController; 
self.menuButtonItem.action = @selector(showMenu); 

實現此目的的最佳方法是什麼?

它應該是一個UIViewController子類,並覆蓋viewDidLoad

OR

它應該是一個UIViewController類別。雖然這不會影響所有視圖控制器,只是一個特定的集合。

回答

1

使它成爲一個類別,只有在您需要的菜單按鈕的代碼文件#import "UIViewController+YourCategory.h"

門類較爲有用,因爲你以後可以把它添加到一個UITableViewController或UISplitViewController,因爲他們的UIViewController的子類。

編輯:需要注意的是,你不能使用像類的子類,即不能從類別覆蓋viewDidLoad是很重要的。您必須創建一個實例方法,如-(void)setupMainMenu,並從您的所有UIViewController的'viewDidLoad方法中調用該方法。

+0

謝謝,我能不能只從UIViewControllers類打電話了嗎?即從類別撥打setupMainMenu。如果我不得不將相關的調用添加到視圖控制器,那麼添加三條線可能不會有太大的麻煩。我想唯一真正的好處是讓代碼在一個地方超過... – StuartM

+0

@StuartM類別只用於向類添加方法,而不是覆蓋。你是對的:好處是乾的:不要重複自己。 – paulrehkugler

1

這正是使用子類的地方。類別用於擴展類,即爲它們提供額外的方法和功能。

你也不能沒有類別的一些嚴重的黑客宣佈新的ivars /屬性,這應該表明,它真的不適合你的目的。

+0

我不一定需要一個新的ivar /屬性,我可以通過'self.navigationItem.leftBarButtonItem'訪問。我可以按照下面的答案設置類別,在這種情況下是否有理由反對它? – StuartM

+1

@StuartM你可以爲此繼承UIViewController,但是你必須確保在你的子類子類中調用[super viewDidLoad]。您失去了將其添加到其他視圖控制器子類(即UITableViewController)的好處。您必須創建UITableViewController的子類才能添加自定義的viewDidLoad。 – paulrehkugler

+0

因爲這個原因,我認爲類別方法在這裏會更好,因爲UITableViewController從UIViewController的子類。感謝您的替代方法,生病加上一個也 – StuartM

1

我實現是簡單地創建一個實用程序,方法和通過必要的參數的方式(我不是合格的目標和選擇假設他們會都是一樣的,但如果他們的viewController從變化到的ViewController你可以通過它們作爲參數太):

Utils.m: 

+ (void) buildMenu:(UIViewController *) viewController 
{ 
    viewController.menuButtonItem.title = @"Menu2"; 
    viewController.menuButtonItem.target = (MESMainNavigationController *)viewController.navigationController; 
    viewController.menuButtonItem.action = @selector(showMenu); 
} 

,你這樣稱呼它從你的所有視圖控制器:

[Utils buildMenu: self]; 
+0

謝謝,我打算去這一類的路線,但我也喜歡這種方法,當然它是可用的任何子類然後我可以傳入任何參數我需要。也加上一個這個。 – StuartM

相關問題