2013-07-25 50 views
3

我試圖在當前顯示的視圖控制器上模態地顯示UIWebview。彈出webview的代碼存在於靜態庫中,並且不知道它所在的應用程序的視圖控制器層次結構。下面的代碼適用於我的測試用例,但不確定它是否適用於所有可能的視圖控制器層次結構。在當前顯示的視圖控制器上呈現UIWebview頂部

UIViewController *rootViewController = [[[UIApplication sharedApplication] keyWindow] rootViewController]; 
UIViewController *presentedVC = [rootViewController presentedViewController]; 
if (presentedVC) { 
    // We have a modally displayed viewcontroller on top of rootViewController. 
    if (!presentedVC.isBeingPresented) { 
    [presentedVC presentViewController:vc animated:YES completion:^{ 
     // 
    }]; 
} else { 
    rootViewController presentViewController:vc animated:YES completion:^{ 
     // 
    }]; 
} 

presentsViewController是否總是給當前可見的視圖控制器?

+0

嗯,如果這個作品,我會感到驚訝。除非我瘋了,否則keyWindow會返回最後一次調用到'makeKeyAndVisisble'的當前可見窗口。 要獲得當前呈現的視圖控制器,這一切都取決於您的層次結構。如果你有一個模態屏幕,那麼它,如果沒有,你有導航控制器作爲根你必須看堆棧的頂部。 我覺得它會很難找到頂級視圖控制器給出了很多方法來設置導航圖層。 – feliun

+1

我想你會想要將當前視圖控制器作爲屬性傳遞給你的庫。 –

+0

@MarcusAdams這絕對是一個選項,但我試圖使這個透明的開發人員使用靜態庫。 – pshah

回答

2

如果你想要做的是在應用程序中顯示的任何視圖控制器之上以模態方式顯示UIWebView,則不需要「最高」視圖控制器。獲取根視圖控制器就足夠了。無論何時,只要我想展示一切視圖,我都會一直這樣做。 你只需要在你的庫根視圖控制器的引用:

self.rootVC = [[[[UIApplication sharedApplication] delegate] window] rootViewController]; 

有了這個參考你現在兩個選擇:

第一種是使用UIViewController的方法presentViewController:animated:completion:顯示另一個查看控制器,將包含UIWebView

第二個選項是假模態視圖控制器通過增加覆蓋整個屏幕,有一個(半)透明背景,幷包含要顯示「模態」視圖中的子視圖。這裏是一個例子:

@interface FakeModalView : UIView // the *.h file 

@property (nonatomic, retain) UIWebView *webView; 
@property (nonatomic, retain) UIView *background; // this will cover the entire screen 

-(void)show; // this will show the fake modal view 
-(void)close; // this will close the fake modal view 

@end 

@interface FakeModalView() // the *.m file 

@property (nonatomic, retain) UIViewController *rootVC; 

@end 

@implementation FakeViewController 
@synthesize webView = _webView; 
@synthesize background = _background; 
@synthesize rootVC = _rootVC; 

-(id)init { 
    self = [super init]; 
    if (self) { 

     [self setBackgroundColor: [UIColor clearColor]]; 
     _rootVC = self.rootVC = [[[[[UIApplication sharedApplication] delegate] window] rootViewController] retain]; 
     self.frame = _rootVC.view.bounds; // to make this view the same size as the application 

     _background = [[UIView alloc] initWithFrame:self.bounds]; 
     [_background setBackgroundColor:[UIColor blackColor]]; 
     [_background setOpaque:NO]; 
     [_background setAlpha:0.7]; // make the background semi-transparent 

     _webView = [[UIWebView alloc] initWithFrame:CGRectMake(THE_POSITION_YOU_WANT_IT_IN)]; 

     [self addSubview:_background]; // add the background 
     [self addSubview:_webView]; // add the web view on top of it 
    } 
    return self; 
} 

-(void)dealloc { // remember to release everything 

    [_webView release]; 
    [_background release]; 
    [_rootVC release]; 

    [super dealloc]; 
} 

-(void)show { 

    [self.rootVC.view addSubview:self]; // show the fake modal view 
} 

-(void)close { 

    [self removeFromSuperview]; // hide the fake modal view 
} 

@end 

如果您有任何其他問題,請讓我知道。

希望這會有所幫助!

+1

第一個選項(使用rootViewController)不會工作,因爲你可以有一個viewcontroller,它已經以模態方式顯示在rootViewController之上。我開始採用這種方法,並得到了上述場景的警告:<視圖不在窗口層次結構中的上的「 – pshah

+0

我會嘗試第二個選項並讓您知道。 – pshah

相關問題