簡體   English   中英

ios5.0和ios5.1之間的splitview poperver問題

[英]splitview poperver issues between ios5.0 and ios5.1

我已經研究了幾乎所有可以找到的相關帖子,並且已經可以使用一些幫助了。

我的項目是使用情節提要構建的通用應用程序。 iPad版本使用拆分視圖控制器。 主視圖關系是具有視圖控制器的導航控制器。 細節視圖是帶有視圖控制器的導航控制器。

沒有意識到這一點,我使用iPad 5.1模擬器構建並測試了該應用程序。 在意識到了這些小細節並需要與iOS 5.0兼容之后,我開始在ios 5.0中進行測試。

發生了兩個重大變化:a)拆分視圖顯示在一個彈出窗口中,而不是全屏顯示,如5.1.1(實際上我更喜歡該彈出窗口),並且b)我的代碼以編程方式隱藏並顯示了在5.1中完美運行的彈出窗口/拆分屏幕在5.0中不起作用-“顯示”實際上使應用程序崩潰。 我構建了兩種方法來顯示/隱藏彈出窗口以補充UI,而不僅僅是依靠方向更改。 例如,我使用show方法將彈出框縱向放置在屏幕上,但在選擇了表格視圖后將其刪除,等等。

因此,也許有人可以提供幫助。 以下是詳細信息和問題-非常感謝您的幫助:

iOS 5.1-顯示彈出窗口-我使用splitview控制器委托調用來獲取對彈出按鈕的引用,然后使用按鈕動作來顯示方法的彈出窗口。 在5.1中可以正常工作,但在5.0中會導致此錯誤:錯誤:無法從沒有窗口的視圖中顯示彈出窗口。 (我已經搜索了此錯誤,並且有很多參考文獻,但沒有針對我的配置的具體答案)。 再加上為什么在5.1而不是5.0中有可用的窗口?

//show master view popover
[self.masterPopoverController presentPopoverFromBarButtonItem:self.showMasterViewButton permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

//get the reference from the button
- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)newpopoverController 
{  
self.showMasterViewButton = [[UIBarButtonItem alloc]initWithTitle:nil style:UIBarButtonItemStyleDone target:barButtonItem.target action:barButtonItem.action];
}

這里的第一個觀察結果是該按鈕實際上在5.0和5.1中都可用,並且顯示並在導航欄上起作用。 但是,在代碼中引用相同的按鈕會導致5.0崩潰並在5.1上運行。 我不知道為什么

將其隱藏在ios 5.0中的相同問題。 在iOS 5.1中就是使用這種方法:

    if (self.masterPopoverController) {
    [self.masterPopoverController dismissPopoverAnimated:YES];
}

在上面列出的相同splitview委托回調中設置了self.masterPopoverController。 這在iOS 5.1中完美運行,但在iOS 5.0中不起作用

注意-更新:我在這里找到了解決我列出的第一個問題的答案: https : //github.com/mattgemmell/MGSplitViewController/pull/31修復了我列出的第一個問題。

//grab a reference to the popover controller in the split view delegate call
//splitview ... willHideViewController
self.masterPopoverController = popoverController;

//then add the following to a method and call it when you need it
//this fixes the no window issue in iOS 5.0
[self.masterPopoverController presentPopoverFromRect:CGRectZero inView:[[UIApplication sharedApplication] keyWindow] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
  • 第二個問題是為什么將彈出窗口更改為幻燈片,並且可以在iOS 5.1中將其更改回幻燈片。 我實際上很喜歡iOS 5.0中針對我的應用程序的彈出效果,但是無法更改幻燈片以使用彈出效果。 我嘗試了多種方法來在多個位置更改彈出框的內容大小,但它似乎對拆分視圖彈出框沒有影響,而類似的代碼在其他雜項上也能正常工作。 按鈕彈出窗口。

我一定錯過了,但是我假設蘋果是故意這樣做的,但是必須有一種替代方法嗎?

注意:找到一種解決方法或至少一種方法來模擬ios5.1上的ios5.0行為

創建一個屬性來保存一個UIViewController,另一個屬性來保存一個UIPopoverController

然后在拆分視圖委托回調中獲取主視圖控制器的副本

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)newpopoverController { 

self.copyOfMasterViewController = viewController;
}

然后像這樣在您的項目中添加一個方法:

-(void)showsPopover {
  self.ios51popover = [[UIPopoverController alloc]initWithContentViewController:self.masterViewInPopover];

 [self.ios51popover setPopoverContentSize:CGSizeMake(320, 580) animated:NO];
 [self.ios51popover presentPopoverFromRect:CGRectMake(50, 55, 1, 1) inView: [[UIApplication sharedApplication] keyWindow] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}

-(void)hidesPopover {[self.ios51popover dismissPopoverAnimated:YES]; }

現在,您同時擁有兩者。

第一個片段顯示了如何在ios5.0和5.1中以編程方式在分離視圖中顯示彈出窗口,並修復了無法從沒有窗口的視圖中顯示彈出窗口的問題。 注意-更新:我在這里找到了解決我列出的第一個問題的答案: https : //github.com/mattgemmell/MGSplitViewController/pull/31修復了我列出的第一個問題。

//在拆分視圖委托調用中獲取對popover控制器的引用// splitview ... willHideViewController

self.masterPopoverController = popoverController;

//然后將以下內容添加到方法中,並在需要時調用它// //修復了iOS 5.0中的無窗口問題[self.masterPopoverController presentPopoverFromRect:CGRectZero inView:[[UIApplication sharedApplication] keyWindow] allowedArrowDirections:UIPopoverArrowDirectionAny animation:YES] ;

下一個代碼片段顯示了如何以ios5.0樣式呈現真實的彈出框,而不是蘋果在iOS 5.1中實際使用的幻燈片

注意:已更新:找到解決方案或至少一種方法來模擬ios5.1上的ios5.0行為創建一個屬性來保存UIViewController,另一個屬性來保存UIPopoverController

然后在拆分視圖委托回調中獲取主視圖控制器的副本

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)newpopoverController { 

self.copyOfMasterViewController = viewController;
}

然后像這樣在您的項目中添加一個方法:

-(void)showsPopover {
  self.ios51popover = [[UIPopoverController   alloc]initWithContentViewController:self.copyOfMasterViewController];

 [self.ios51popover setPopoverContentSize:CGSizeMake(320, 580) animated:NO];
 [self.ios51popover presentPopoverFromRect:CGRectMake(50, 55, 1, 1) inView: [[UIApplication sharedApplication] keyWindow] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}

-(void)hidesPopover { [self.ios51popover dismissPopoverAnimated:YES]; }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM