rez*_*afi -1 containers swipe ios uipageviewcontroller swift3
我用数据源数组制作了UIPageViewController,它运行正常.但是当向右滑动转发时,请调用After和Before方法.
我的代码在这里:
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
}
Run Code Online (Sandbox Code Playgroud)
和儿童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()
}
}
Run Code Online (Sandbox Code Playgroud)
请帮我解决这个问题谢谢.
页面视图控制器不是问题.关于何时viewControllerBefore和viewControllerAfter被调用的假设是一个问题.你的假设似乎是合理的,但它们是错的,正如我现在要解释的那样.
例如,您假设当我在第3页并且我开始向第4页滑动时,viewControllerAfter会调用第3页,以便您可以提交第4页.但事实并非如此.页面视图控制器的滚动实现使用缓存和前瞻来更快地滚动.因此,当你执行我刚刚描述的操作时,可能是第4页已经被缓存,现在,当滚动结束时,PVC将调用viewControllerAfter第5页,以便在您再次滚动时预先缓存它同样的方式.或者,如果这是最后一页,则可能根本不会调用任何内容.
此行为意味着你不能做出任何假设时, viewControllerBefore和viewControllerAfter被称为或什么页面,他们被称为.但是你的代码,在这些方法中使用通知,取决于这些假设 - 而且这些假设是错误的,这就是你的代码无效的原因.在你看来,所有东西都是一个接一个的 - 因为它是.
你也许可以依靠你的信号,而不是在解决问题的委托方法willTransitionTo和didFinishAnimating(见UIPageViewControllerDelegate的文档).
| 归档时间: |
|
| 查看次数: |
1878 次 |
| 最近记录: |