2016-11-04 22 views
2

我一直試圖弄清楚這幾個小時,我必須誤解UIPageViewController如何工作。如何更改從屬於UIPageViewController一部分的UIViewController之一的UIPageViewController?

我有5個設置屏幕(加載到UIPageViewController的單獨視圖控制器),我可以向右滑動+向左滑動以查看。

但是!我希望能夠以編程方式顯示下一個視圖控制器後,他們關閉其中一個視圖控制器的警報。

到目前爲止,我已經發現靠攏唯一的解決辦法,這是這裏的解決方案(https://github.com/jeffaburt/UIPageViewController-Post),允許「下一步」按鈕,但按鈕不是唯一的顯示視圖控制器上,它位於保存UIPageViewController的根視圖控制器上。

我有UIPageViewController設置顯示5個不同的視圖控制器,與此代碼。

private(set) lazy var orderedViewControllers: [UIViewController] = { 
    return [self.newColoredViewController("setup1"), 
      self.newColoredViewController("setup2"), 
      self.newColoredViewController("setup3"), 
      self.newColoredViewController("setup4"), 
      self.newColoredViewController("setup5")] 
}() 

然後newColoredViewController功能做到這一點:

private func newColoredViewController(color: String) -> UIViewController { 
    return UIStoryboard(name: "Main", bundle: nil) . 
     instantiateViewControllerWithIdentifier("\(color)") 
} 

,這裏是我的viewDidLoad

override func viewDidLoad() { 
    super.viewDidLoad() 

    dataSource = self 



    if let SetupViewController = orderedViewControllers.first { 
     setViewControllers([SetupViewController], 
          direction: .Forward, 
          animated: true, 
          completion: nil) 
    } 


} 

我必須失去一些基本的瞭解,因爲我已經嘗試了許多不同的方法以編程方式更改頁面,並且沒有任何反應。

我已經試過這樣做,但不起任何作用:

setViewControllers([orderedViewControllers[3]], 
          direction: .Forward, 
          animated: true, 
          completion: nil) 

我已經試過這樣做,但不起任何作用:

func scrollToNextViewController() { 
    if let visibleViewController = viewControllers?.first, 
     let nextViewController = pageViewController(self, 
                viewControllerAfterViewController: visibleViewController) { 
     scrollToViewController(nextViewController) 
    } 
} 

請點我正確的方向!我可以整天研究,通常可以找出答案,這要歸功於之前已經回答的stackoverflow問題,但在這裏我很難過。

在此先感謝!

回答

0

我想在newColoredViewController你創建的視圖控制器的實例將由pageViewController顯示。

在那裏你應該傳遞給顯示視圖控制器的引用。類似於 newSetupViewConroller.setNextDelegate(self)

定義一個協議NextDelegate具有方法performNext

這應該是參數的setNextDelegate類型(及相關的實例變量)。 (可替換地,以一個setter方法可以當然聲明NextDelegate類型的一些屬性)

你的呈現視圖控制器應符合該協議和實現performNext方法。

當你這樣做時,你可以訪問呈現視圖控制器(作爲一個符合協議的對象),你可以調用它的方法performNext

在方法performNext中,您位於您的展示視圖控制器中,並有權訪問pageViewController並從那裏開始。

(有這樣做的更簡單的方法,但我認爲這是正確的一個。這就是協議的製作。)

+0

確認!我幾乎不知道如何實施你剛剛解釋的內容。所以,我應該改變函數 'private func newColoredViewController(color:String) - > UIViewController {return}返回UIStoryboard(名稱:「Main」,bundle:nil)。 instantiateViewControllerWithIdentifier(「\(color)」) }' 並嘗試傳遞一個變量?當你說「傳遞給顯示視圖控制器的引用時,我該如何做到這一點? –

+0

你說有更簡單的方法可以做到這一點 - 你可以對這些問題有所瞭解嗎?我都是正確的做法事情,但老實說,我不認爲我可以實現你所解釋的,因爲我不是一個編碼器的水平!! –

+0

是的,不要直接返回實例,但暫時保持它在一些局部變量一會兒,並通過提交視圖控制器 但我的建議是不聲明參數爲呈現視圖控制器的類的對象,但使用協議之間。兩種方式的類耦合工作正常,但不是很好的風格。 –

2

我想出了一個簡單的方法來構造我會內做到這一點已經建立起來了。在UIPageViewController,添加了這個功能:

func nextPageWithIndex(index: Int) 
{ 
    // let nextWalkthroughVC = newColoredViewController("setup4") 
    let nextWalkthroughVC = orderedViewControllers[index] 
     setViewControllers([nextWalkthroughVC], direction: .Forward, animated: true, completion: nil) 

} 

,然後在我創建的運行該代碼按鈕動作設置視圖控制器之一:

@IBAction func yeaaa(sender: AnyObject) { 
       let parent = self.parentViewController as! SetupViewController 

    parent.nextPageWithIndex(3) 
} 

(其中「SetupViewController」是UIPageViewController)

YEEHAWWWW這讓我瘋狂。

下面是給我的想法「self.parentViewController爲SetupViewController!」和「nextPageWithIndex」代碼中的視頻:https://www.youtube.com/watch?v=K3CSBxX5VXA

相關問題