0

我有一个显示在几个视图控制器上的菜单按钮。使用的代码添加到UIViewController'viewDidLoad方法中。

而不是重新使用下面相同的样板代码。

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

实现这一点的最佳方法是什么?

它应该是的子类UIViewController并覆盖viewDidLoad?

或者

它应该是一个UIViewController类别。虽然这不会影响所有视图控制器,但只会影响特定的一组。

4

3 回答 3

1

将其设为类别,并且仅#import "UIViewController+YourCategory.h"在您需要菜单按钮代码的文件中。

类别更有用,因为您可以稍后将其添加到 UITableViewController 或 UISplitViewController,因为它们是 UIViewController 的子类。

编辑:重要的是要注意您不能使用像子类这样的类别,即您不能viewDidLoad从类别中覆盖。您必须创建一个实例方法,-(void)setupMainMenu并从您的所有UIViewControllersviewDidLoad方法中调用它。

于 2013-09-30T16:21:22.457 回答
1

我实现的方式是简单地创建一个 util 方法并传递必要的参数(我没有传递目标和选择器,假设它们对所有人都是一样的,但是如果它们从 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];
于 2013-09-30T17:41:39.317 回答
1

这正是使用子类化的地方。类别用于扩展类,即为它们提供额外的方法和功能。

如果没有严重的类别黑客攻击,您也无法声明新的 ivars/属性,这应该表明它确实不适合您的目的。

于 2013-09-30T16:37:59.340 回答