那么每个视图都需要在一个独特的导航控制器中呈现吗?然后你可能会稍微改变你的计划并写下类似的内容:
@interface UINavigationController (NavigationControllerWithViewController)
+ navigationControllerWithRootViewControllerOfType:(Class)type;
@end
/* ... */
@implementation UINavigationController (NavigationControllerWithViewController)
+ navigationControllerWithRootViewControllerOfType:(Class)type
{
UIViewController *modal = [[type alloc] init];
UINavigationController *navCon = [[UINavigationController alloc]
initWithRootViewController:modal];
[modal release];
return [navCon autorelease];
}
@end
因此,您已经声明了一个类别UINavigationController
(即一种向类添加新方法而无需对其进行子类化或访问原始源的方法),它执行实例化视图控制器、创建相关导航控制器并返回它。然后你可以这样做:
UINavigationController *controller =
[UINavigationController navigationControllerWithRootViewControllerOfType:
[MyModalController class]];
[self presentModalViewController:controller];
或者传入你想要的任何类型的视图控制器来代替MyModalController
. 如果你传递了一个不是 a 的类,UIViewController
那么你最终会将不是视图控制器的东西传递给UINavigationController -initWithRootViewController:
方法,所以要小心。
至于委托,我猜你会做一个协议和委托的通常声明,然后在你的导航控制器类别方法中添加一个额外的参数来提供一个委托。您将失去有用和无用的编译时警告,但您可能想要这样做:
[(id)modal setDelegate:delegate];
如果您尝试使用没有委托属性的东西来实例化导航控制器,这将导致异常。