2017-02-03 10 views
-1

データソース配列を使用してUIPageViewControllerを作成したところ、正しく動作します。しかし、転送のために右にスワイプすると、AfterメソッドとBeforeメソッドの両方が呼び出されます。
私のコードここにある:ここUIPageViewControllerのAfterメソッドとBeforeメソッドの両方をSwift 3で転送する場合iOS

import UIKit 

class MainPageViewController: UIPageViewController,UIPageViewControllerDataSource { 


override func viewDidLoad() { 
    super.viewDidLoad() 

    self.dataSource = self 
initUPageVC(idx:0,isAnimate:false,direction: UIPageViewControllerNavigationDirection.forward) 
} 
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? 
{ 

    //PRIVIOUS 
    let pageContent: MainPageContentViewController = viewController as! MainPageContentViewController 

    var index = pageContent.index 

    if ((index == 0) || (index == NSNotFound)) 
    { 
     return nil 
    } 

    index -= 1; 

    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "updateMenuBarItemSelectedNotif"), object: index) 

    return getViewControllerAtIndex(index) 
} 

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

    //NEXT 
    let pageContent: MainPageContentViewController = viewController as! MainPageContentViewController 

    print("now n",pageContent.index) 

    var index = pageContent.index 

    if (index == NSNotFound) 
    { 
     return nil; 
    } 

    index += 1; 

    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "updateMenuBarItemSelectedNotif"), object: index) 

    return getViewControllerAtIndex(index) 
} 
func getViewControllerAtIndex(_ index: Int) -> MainPageContentViewController 
{ 
    // Create a new view controller and pass suitable data. 

    let destinationVC = self.storyboard?.instantiateViewController(withIdentifier: "MainPageContentVCID") as! MainPageContentViewController 

    destinationVC.index = index 


    return destinationVC 
} 
func initUPageVC(idx:Int,isAnimate:Bool,direction:UIPageViewControllerNavigationDirection) { 

    self.setViewControllers(
     [getViewControllerAtIndex(idx)], 
     direction: direction, 
     animated: isAnimate, completion: nil) 

    let destinationVC = self.storyboard?.instantiateViewController(withIdentifier: "MainPageContentVCID") as! MainPageContentViewController 

    destinationVC.index = idx 

} 

と子VCコード:

import UIKit 

class MainPageContentViewController: UIViewController,UITableViewDataSource,UITableViewDelegate { 

@IBOutlet var tableView: UITableView! 
var dataSource : Array<Item>! 
var index:Int = 0 
var myStr:String! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    tableView.register(UINib(nibName: "ItemCellNib", bundle: nil), forCellReuseIdentifier: "ItemCellIdentifier") 

    prepareData() 

} 
//MARK: Table View 
func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return dataSource.count 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCell(withIdentifier: "ItemCellIdentifier", for: indexPath) as! ItemTableViewCell 

    let obj = dataSource[indexPath.row] 

    cell.itemImage.image = UIImage(named:obj.imageName) 




    cell.selectionStyle = UITableViewCellSelectionStyle.none 

    return cell 
} 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    let obj = dataSource[indexPath.row] 
    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "itemHasClickedNotif"), object: obj) 
} 

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    return 197 
} 

func prepareData(){ 
    let obj0 = Item() 
    let obj1 = Item() 
    let obj2 = Item() 
    let obj3 = Item() 

    if index == 0 { 

    obj0.ID = 0 
    obj0.imageName = "dog" 

    obj1.ID = 1 
    obj1.imageName = "dog" 

    obj2.ID = 2 
    obj2.imageName = "dog" 

    obj3.ID = 3 
    obj3.imageName = "dog" 

}else if index==1{ 

obj0.ID = 0 
obj0.imageName = "cat" 

obj1.ID = 1 
obj1.imageName = "cat" 

obj2.ID = 2 
obj2.imageName = "cat" 

obj3.ID = 3 
obj3.imageName = "cat" 
}else{ 
obj0.ID = 0 
obj0.imageName = "lion" 

obj1.ID = 1 
obj1.imageName = "lion" 


obj2.ID = 2 
obj2.imageName = "lion" 


obj3.ID = 3 
obj3.imageName = "lion" 

} 


    dataSource = [obj0,obj1,obj2,obj3] 

    tableView.setContentOffset(CGPoint.zero, animated: false) 

    tableView.reloadData() 
} 
} 

ありがとう この問題を解決するために私を助けてください。

答えて

3

ページビューコントローラーに問題はありません。 viewControllerBeforeviewControllerAfterの場合は、あなたの前提に問題があります。あなたの前提は合理的だと思われますが、私は今説明するように間違っています。

例えば、私がページ3にいるときにページ4にスワイプし始めると仮定しています.がページ3を呼び出すので、ページ4を送信できます。これは当てはまりません。ページビューコントローラのスクロールインプリメンテーションでは、キャッシングlookaheadを使用してスクロールを高速化します。したがって、今説明したように、ページ4がすでにキャッシュされている可能性があります。スクロールで終了すると、PVCはページ5のためにviewControllerAfterを呼び出します。後で同じ方法で再びスクロールします。または、これが最後のページであれば、何も呼び出されないことがあります。

この動作はviewControllerBeforeviewControllerAfterが呼び出されるか、それらが呼ばれどのページのためにするときにについての仮定を行うことができないことを意味します。しかし、あなたのコードは、それらのメソッドで通知を使用することで、そのような前提に左右されます。これらの仮定は間違っているため、コードが機能しません。すべてがあなたのものであると思われるからです。

あなたは(UIPageViewControllerDelegate上のドキュメントを参照してください)デリゲート方法willTransitionTodidFinishAnimatingに代わりに信号のために依存することで問題を解決できる可能性があります。

+0

私の答えが正しい場合は、それを受け入れてください(チェックマーク)。 – matt

関連する問題