4

使用通用故事板和自適應搜索時,如何實現一個Present Popover segue,該搜索將具有導航欄(帶有標題並關閉按鈕)僅在iPhone上進行模態呈現時,並且在呈現爲彈出窗口時不會在iPad上具有導航控制器?如何實現一個UINavigationController用於模態演示,而不是彈出窗口,具有自適應搜索功能

我相信適當的設置是在故事板中不包含導航控制器,控制拖動到新的視圖控制器並選擇Present As Popover segue。然後在prepareForSegue中,需要創建導航控制器並在其中嵌入目標控制器,然後添加標題和按鈕,但僅限於以模態方式顯示。如果這種方法是正確的,那麼在代碼中如何做到這一點?

+0

不,這是行不通的。到prepareForSegue被調用時,源視圖控制器和目標視圖控制器已經被定義;您無法通過將其嵌入到導航控制器中來更改目標視圖控制器。 – rdelmar

回答

3

Rdelmar是正確的,您不能在prepareForSegue中執行此操作,因爲已經設置了目標視圖控制器。

在iOS 7及更早版本中,您必須將該導航控制器添加到故事板,然後才能將導航控制器和其根視圖分開放置。然後根據是否需要導航控制器(iPhone)或不需要(iPad)觸發正確的繼續。

在iOS中8,你可以使用新的UIAdaptivePresentationControllerDelegate協議,然後動態地創建導航控制器,在你需要它:

func presentationController(controller: UIPresentationController!, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController! 
{ 
    let presented = controller.presentedViewController 
    return UINavigationController(rootViewController: presented) 
} 
0

爲了詳細說明這一點了,如果你要的是酥料餅上你的iPad,但你的iPhone上有一個關閉按鈕的模式表,那麼這就是你的方式。

在Xcode的6.3分鏡,你鉤了一個視圖控制器和指定SEGUE爲「存在酥料餅」

此代碼在塞格斯到酥料餅的,而不是在酥料餅本身的視圖控制器應該去:

首先設置好酥料餅的委託:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if (segue.identifier == "myPopoverSegueName") { 
     let vc = segue.destinationViewController 
     vc.popoverPresentationController?.delegate = self 
     return 
    } 
} 

然後添加委託擴展和動態創建的導航控制器/關閉按鈕:

extension myViewController: UIPopoverPresentationControllerDelegate { 

    func presentationController(controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? { 
     let btnDone = UIBarButtonItem(title: "Done", style: .Done, target: self, action: "dismiss") 
     let nav = UINavigationController(rootViewController: controller.presentedViewController) 
     nav.topViewController.navigationItem.leftBarButtonItem = btnDone 
     return nav 
    } 

} 

然後添加你的解僱功能,你應該是好去:

func dismiss() { 
    self.dismissViewControllerAnimated(true, completion: nil) 
} 
相關問題