2011-07-06 11 views
5

我正在设计一个将被其他开发人员使用的iOS静态库。这个库需要提供自己的模态UI。我正在寻找最简单的方法来设计应用程序和此库之间的接口来完成此操作。我只需要支持iOS 4.0及更高版本。设计提供自己的模态UI的iOS静态库的最简单方法是什么?

粗糙架构

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

我可以看到两种方法来实现这一点。

选项1

当应用程序需要的库,以显示其UI,该通行证的AppDelegate在self.window,和库设置自己的根视图控制器,有效地采取UI的全部所有权。 UI完成后,它会通知AppDelegate,AppDelegate然后在窗口上设置自己的根视图控制器,并取回UI的所有权。

选项2

库暴露视图控制器,其应用可以推到它喜欢的任何视图堆栈。当图书馆通知用户界面已完成时,该应用程序还负责删除视图控制器。

问题

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

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

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

回答

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. 

然后用

[[UIApplication sharedApplication].keyWindow.rootViewController presentModalViewController: myViewController animated: YES]; 

将其切断,并从一个已经嵌入到两个不同的iOS应用程序,似乎都在很好地工作工作静态库粘贴显示。有可能是边缘情况,这不包括,但我还没有击中他们:)

+0

我们需要在NSObject类中编写代码 –

+0

几乎每个类你放这个是NSObject的后裔它必须是ObjectiveC代码,所以我不确定我理解你的问题。请注意,这是> 2岁,所以不知道这是否仍然有效。 – Dad

+0

Tnx回复您的代码运行良好。这是我的代码中的一个错误。真棒代码它节省了我的时间很多.. –

1

使用块代替委托。当视图完成时,您的视图应该调用存储在属性中的提供的dismissBlock,并且调用者可以从该块执行所需的操作。有数据需要传回?根据需要将它作为块的参数或将其放入可从视图控制器访问的对象的属性中。

如果您的状态需要存储以响应事件,请提供一种方法将该信息保存到某些数据中,并从一个数据块恢复UI。来电者可以按照他们的意愿处理。

准确地说,如何以模态方式显示UI应该取决于客户端应用程序,但通过规定UI必须确实以模态方式显示,您必须限制其环境,以免不必太担心主机环境。

5

你有没有考虑在设计你的API接受UIViewController

- (void)presentFromViewController:(UIViewController *)presentingViewController 
         animated:(BOOL)animated 
{ 
    [presentingViewController presentModalViewController:myViewController 
               animated:animated]; 
} 

这样的话,你的图书馆拥有的模式UI是如何呈现的完全控制,并且还可以拨打-dismissViewControllerAnimated:本身,而不是依靠委托这样做。

不要打扰传递-applicationWillResignActive:等。只需在您的库类中注册底层通知UIApplicationWillResignActiveNotification等。

相关问题