设计提供自己的模态UI的iOS静态库的最简单方法是什么?

Bob*_*man 5 delegates modal-dialog static-libraries ios

我正在设计一个将由其他开发人员使用的iOS静态库.该库需要提供自己的模态UI.我正在寻找最简单的方法来设计应用程序和这个库之间的接口来实现这一目标.我只需要支持iOS 4.0及更高版本.

粗糙的建筑

我的静态库有一个非常简单的API,只有一个类.应用程序的AppDelegate实例化这一个类并将其自身设置为委托,以便它可以接收通知.当应用程序希望库显示其UI时,它会调用单个方法,然后当库完成其工作时,它会通过其中一个委托协议的方法发送通知.

我可以看到两种方法来实现这一目标.

选项1

当应用程序希望库显示其UI时,AppDelegate会传入self.window,并且库会设置自己的根视图控制器,从而有效地获取UI的完全所有权.UI完成后,它会通知AppDelegate,AppDelegate会在窗口上设置自己的根视图控制器,从而收回UI的所有权.

选项2

该库公开了一个视图控制器,应用程序可以将其推送到它喜欢的任何视图堆栈上.当库通知UI已完成时,应用程序还负责删除视图控制器.

问题

使用选项1,在运行应用程序的过程中更改根视图控制器可能会出现问题.对于选项2,可能存在提供可在任意上下文中工作的视图控制器的问题(作为全窗口视图控制器,作为UINavigationController的子视图等).

这两个选项的另一个问题是AppDelegate可能收到的其他UIApplicationDelegate通知,例如applicationWillResignActive:和applicationDidBecomeActive:.库可能需要处理这样的通知以正确维护其UI.当UI处于活动状态时,AppDelegate是否必须将其中的每一个传递给库?

有没有更好的选择3我没有想到?

hat*_*nch 5

您是否考虑过设计API以接受UIViewController:

- (void)presentFromViewController:(UIViewController *)presentingViewController
                         animated:(BOOL)animated
{
    [presentingViewController presentModalViewController:myViewController
                                                animated:animated];
}
Run Code Online (Sandbox Code Playgroud)

这样,您的库可以完全控制模式UI的呈现方式,也可以调用-dismissViewControllerAnimated:自身而不是依赖委托来执行此操作.

不要费心去处理-applicationWillResignActive:等.只需UIApplicationWillResignActiveNotification在图书馆课程中注册基础通知等.


Dad*_*Dad 3

我是这样做的:在静态库中创建 UIViewController 以及以编程方式需要的所有内容视图(因为您无法轻松地在 iOS 上创建框架,所以无法轻松捆绑资源):

UIViewController *controller = [[[UIViewController alloc] initWithNibName: nil bundle: nil] autorelease];
UIView *containerView = [[[UIView alloc] initWithFrame: [UIScreen mainScreen].applicationFrame] autorelease];
containerView.backgroundColor = [UIColor darkGrayColor];

UIWebView *webView = [[[UIWebView alloc] initWithFrame: containerView.bounds] autorelease];
webView.delegate = self;

// ... some other code to setup custom things

[containerView addSubview: webView];

// ... some other code to setup custom things, spinner etc.
Run Code Online (Sandbox Code Playgroud)

然后显示它

[[UIApplication sharedApplication].keyWindow.rootViewController presentModalViewController: myViewController animated: YES];
Run Code Online (Sandbox Code Playgroud)

这是从一个工作静态库中剪切并粘贴的,该静态库已嵌入到两个不同的 iOS 应用程序中,并且似乎在这两个应用程序中都运行良好。可能有一些边缘情况没有涵盖,但我还没有遇到:)