2011-07-06 13 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等。

相關問題