2015-10-18 35 views
0

我的目標提出的iOS鍵盤的延長與方法presentViewController:animated:completion每當鍵盤已成功實例化,走的是平穩向上的動畫的優勢,提出了iOS鍵盤。如何使用presentViewController

一些非常簡短的背景:鍵盤擴展項目用Objective-C編寫,其中KeyboardViewController.h/.m處理邏輯和inputView.xib的一些基本視圖佈局。

基於此SO question,幾個答案建議使用從[UIApplication sharedApplication].keyWindow.rootViewController的方法。問題是,因爲這是一個iOS擴展,當我嘗試複製此方法時,出現sharedApplication不可用的錯誤。我想知道是否存在一種變通方法,我可以,或者以某種方式通過自身或通過super呈現與方法presentViewController鍵盤?在我目前的嘗試中,撥打[self presentViewController: self...]會導致異常。

非常感謝!

回答

1

它不能這樣做。

人們可以真正獲取到[UIApplication sharedApplication]參考容易,最簡單的(雖然容易讓你在App Store的審覈拒絕)將是:

Class appClass = NSClassFromString(@"UIApplication"); 
    id app = [appClass performSelector:@selector(sharedApplication)]; 

運行在iPhone 5的模擬器,[app keyWindow]回報nil時從主輸入視圖控制器的viewDidAppear:方法調用。

[UIApplication windows],但是,不,所以我們可以嘗試

[[[app windows].firstObject rootViewController] presentViewController:self 
                    animated:YES 
                   completion:nil]; 

...但它只是拋出一個異常:

***終止應用程序由於未捕獲的異常 'NSInvalidArgumentException' ,原因:'應用程序試圖以模態方式呈現 主動控制器。'

從散步開始UIApplication windows]視圖層次揭示了一個有趣的事實:我們的UIInputViewController窗口是不能在此窗口層次self.view.window返回一個單獨的_UIHostedWindow沒有superView

此外,還有來自[UIApplication sharedApplication]返回窗口的內存跨越地址的應用程序沒有變化。

結論:我們從sharedApplication得到的UIApplication是我們的過程,而不是主機過程。因此,在它所擁有的視圖和窗口上呈現是沒有意義的,因爲它的視圖對於用戶是不可見的。

+0

感謝徹底調查本。我會把這個問題再提出幾天,如果沒有人有相反的說法,我會給你賞金這個答案。 – daspianist

相關問題