2

在我的应用程序中,我有很多模态视图需要在导航控制器中呈现,所以我最终做了很多这样的事情:

MyModalController *modal = [[MyModalController alloc] init];
UINavigationController *navCon = [[UINavigationController alloc] initWithRootViewController:modal];
[modal release];

[self presentModalViewController:navCon];
[navCon release];

理想情况下,我想简化这一点,以便 MyModalController 负责创建导航控制器。这种事情的任何最佳实践?我想我总是可以添加一个类似的方法+navigationControllerWithModalController,但我想听听其他人是如何做到的。

另外,我希望能够将委托附加到 MyModalController,这样我就可以将信息发送回当前视图控制器,这样我就知道何时关闭它。

4

1 回答 1

0

那么每个视图都需要在一个独特的导航控制器中呈现吗?然后你可能会稍微改变你的计划并写下类似的内容:

@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];

如果您尝试使用没有委托属性的东西来实例化导航控制器,这将导致异常。

于 2011-09-01T18:57:35.967 回答