2017-02-03 35 views
-1

Я создал UIPageViewController с массивом данных и работает правильно. Но при прокручивании вправо для переадресации вызова методов After и Before.
Мои коды здесь:Вызов обоих методов After и Before в UIPageViewController при плавании для пересылки в 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

Это не проблема с контроллером просмотра страниц. Это проблема с вашими предположениями о том, когда viewControllerBefore и viewControllerAfter. Ваши предположения кажутся разумными, но они ошибаются, как я сейчас объясню.

Вы предполагаете, например, что, когда я нахожусь, например, на стр. 3, и я начинаю прокручивать страницу 4, вызывается для страницы 3, чтобы вы могли отправить страницу 4. Это неверно. Прокрутка реализации контроллера просмотра страниц использует кеширование и lookahead, чтобы ускорить прокрутку. Таким образом, когда вы делаете то, что я только что описал, может быть, что страница 4 уже кэширована, и теперь, когда прокрутка заканчивается, ПВХ вызовет viewControllerAfter для страницы 5, чтобы предварительно кэшировать ее, если вы прокрутите снова тот же путь позже. Или, если это последняя страница, может быть, что ничего не будет вызвано вообще.

Такое поведение означает, что вы не можете делать какие-либо предположения о когдаviewControllerBefore и viewControllerAfter называются или для того, что страница они называются. Но ваш код с использованием уведомлений в этих методах зависит от таких допущений - и эти допущения ошибочны, и поэтому ваш код не работает. Кажется, вам кажется, что вы не в порядке, потому что это так.

Вы можете быть в состоянии решить эту проблему, опираясь на ваши сигналы, а не на делегата методы willTransitionTo и didFinishAnimating (см документацию на UIPageViewControllerDelegate).

+0

Если мой ответ верен и вам помог, пожалуйста, примите его (галочка). – matt