2017-02-13 127 views
0

Xcode/Swift比較新,但在其他語言中有一些經驗。UIPageView中的更新標籤

我在應用的嬰兒期階段,並正在努力實現以下功能:

UIPageView環境中,當用戶掃描前,(其值是一個整數)標籤增加1。當用戶向後滑動時,標籤減1。

我有一個單一的UIViewController作爲內容頁與故事板ID PageContentViewController

從本質上講,我的想法是申報初始設置爲0的整型變量,然後創建一個swipedBack()swipedRight()功能,更新變量的值,然後設置標籤上PageContentViewController文本該變量的值。該功能然後返回新的PageContentViewController

我收到了一些奇怪的行爲。也就是說,該應用程序正在建設並運行良好。

初始屏幕加載的標籤爲0.然後我向前滑動,它會更新爲1.但是然後...如果我再次向前滑動,則標籤保持爲一個。但是,那麼......如果我繼續前進,那麼它就會按照期望行事 - 先是2,然後是3.然後,如果我反轉方向,它就會變得更加奇特。

如果我的數值是4,然後向後滑動,它會減少到3.但隨後再次滑回它將返回到4,然後繼續滑動,它將按預期行爲(4,3, 2,1 ......)。我顯然有一個概念誤解,並希望得到一些幫助。

這裏是我的代碼:

import UIKit 

class ViewController: UIPageViewController, UIPageViewControllerDataSource { 

    var arrPageTitle: NSArray = NSArray() 

    var t: Int = 0 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.dataSource = self 

     self.setViewControllers([getViewControllerAtIndex()] as [UIViewController], direction: UIPageViewControllerNavigationDirection.forward, animated: false, completion: nil) 
    } 

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { 
     return swipedBack() 
    } 

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 
     return swipedForward() 
    } 

    func getViewControllerAtIndex() -> PageContentViewController { 
     let pageContentViewController = self.storyboard?.instantiateViewController(withIdentifier: "PageContentViewController") as! PageContentViewController 

     pageContentViewController.strTitle = "\(t)" 
     return pageContentViewController 
    } 

    func swipedForward() -> PageContentViewController { 

     let pageContentViewController = self.storyboard?.instantiateViewController(withIdentifier: "PageContentViewController") as! PageContentViewController 

     t = t + 1 

     pageContentViewController.strTitle = "\(t)" 
     return pageContentViewController 

    } 

    func swipedBack() -> PageContentViewController { 

     let pageContentViewController = self.storyboard?.instantiateViewController(withIdentifier: "PageContentViewController") as! PageContentViewController 

     t = t - 1 
     pageContentViewController.strTitle = "\(t)" 
     return pageContentViewController 

    } 

} 

回答

1

我想這大概是因爲一旦你改變方向,最近的UIViewController仍然在內存中,從而委託函數沒有被調用。

我建議使用pageViewControllerWillTransitionTo函數來代替。這應該在每次刷卡時調用。同樣,如果您希望在刷卡後發生呼叫,則可以使用pageViewControllerDidFinishAnimating

爲了檢測您所滑動的方向,您可以嘗試同時使用UISwipeGestureRecognizer,並調用函數來增加/減少變量值。實際上,現在我想到了,您可以只使用這個手勢識別器而無需委託功能。由你決定。

+0

謝謝。我曾嘗試實現基本的UISwipeGestureRecognizers,並嘗試在發生這些滑動時調用swipeBack和swipeForward函數。但是當我在模擬器中滑動時,標籤沒有更新。 '@IBAction FUNC swipeBack(_發件人:UISwipeGestureRecognizer){ T = T-1 lblTitle.text = 「刷回」 } @IBAction FUNC swipeForward(_發件人:UISwipeGestureRecognizer){ T = T + 1 lblTitle.text =「向前滑動」 }' 這是在PageContentViewer.Swift文件中調用 –

+0

它們爲什麼是IBActions?這可能是問題的一部分。讓他們正常的功能。 –

+0

我在故事板上創建了它們?將手勢識別器對象拖動到contentPageViewer視圖控制器上?他們自動生成的語法... –