我需要删除 UIPageViewController
中所有缓存的前后 View Controller ,以便在用户滚动 UIPageViewController
时创建新的前后 View Controller 。
如何删除 View Controller 之前和之后的缓存?
我需要许多可以控制 UIPageViewController
的函数,但似乎很少有函数可以做到这一点。
*我附上了我的代码的简化版本。 整个调用序列非常复杂,因为它包括 Alamofire HTTP 请求并异步工作。
class ViewCalendarPageVC: UIPageViewController {
var targetViewCalendarVC: ViewCalendarVC2?
var viewCalendarVC: ViewCalendarVC2?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
dataSource = self
let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
// Instantiate View Controller
viewCalendarVC = storyboard.instantiateViewController(withIdentifier: "ViewCalendarVC2") as! ViewCalendarVC2
var parentVC: TopViewController = (self.parent as? TopViewController)!
viewCalendarVC!.selectedMonthYear = parentVC.selectedMonthYear!
setViewControllers([viewCalendarVC!], direction: .forward, animated: true, completion: nil)
}
func showCalendar(){
targetViewCalendarVC?.showCalendar()
}
}
extension ViewCalendarPageVC: UIPageViewControllerDataSource {
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
// Instantiate View Controller
let viewController = storyboard.instantiateViewController(withIdentifier: "ViewCalendarVC2") as! ViewCalendarVC2
var dateComponent = DateComponents()
dateComponent.month = -1//monthsToAdd
dateComponent.day = 0 //daysToAdd
dateComponent.year = 0 //yearsToAdd
var parentVC: TopViewController = (self.parent as? TopViewController)!
viewController.selectedMonthYear = Calendar.current.date(byAdding: dateComponent, to: parentVC.selectedMonthYear!)
return viewController
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
// Instantiate View Controller
let viewController = storyboard.instantiateViewController(withIdentifier: "ViewCalendarVC2") as! ViewCalendarVC2
var dateComponent = DateComponents()
dateComponent.month = +1//monthsToAdd
dateComponent.day = 0 //daysToAdd
dateComponent.year = 0 //yearsToAdd
var parentVC: TopViewController = (self.parent as? TopViewController)!
viewController.selectedMonthYear = Calendar.current.date(byAdding: dateComponent, to: parentVC.selectedMonthYear!)
return viewController
}
}
最佳答案
我认为“重置”缓存的唯一方法是 UIPageViewController
中的 setViewControllers
方法:
let vc = UIViewController()
setViewControllers([vc], direction: .forward, animated: false, completion: nil)
所以要在用户滚动后执行此操作,显示的 ViewController 应该在它出现后立即通知 PageViewController:
protocol MyPageViewControllerDelegate: class {
func viewControllerDidAppear(_ vc: UIViewController)
}
class MyPageViewController: UIPageViewController, MyPageViewControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
let vc = MyViewController()
vc.delegate = self
setViewControllers([vc], direction: .forward, animated: false, completion: nil)
}
func viewControllerDidAppear(_ vc: UIViewController) {
setViewControllers([vc], direction: .forward, animated: false, completion: nil)
}
}
class MyViewController: UIViewController {
weak var delegate: MyPageViewControllerDelegate?
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
delegate?.viewControllerDidAppear(self)
}
}
注意:我没有测试这段代码,如果在调用setViewControllers
之后每次都调用viewDidAppear
,可能会导致无限循环。试一试,让我知道
更新:
protocol MyPageViewControllerDelegate: class {
func viewControllerDidAppear(_ vc: UIViewController)
}
class ViewCalendarPageVC: UIPageViewController {
var targetViewCalendarVC: ViewCalendarVC2?
var viewCalendarVC: ViewCalendarVC2?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
dataSource = self
let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
// Instantiate View Controller
viewCalendarVC = storyboard.instantiateViewController(withIdentifier: "ViewCalendarVC2") as! ViewCalendarVC2
var parentVC: TopViewController = (self.parent as? TopViewController)!
viewCalendarVC!.selectedMonthYear = parentVC.selectedMonthYear!
viewCalendarVC.delegate = self // ADD THIS and implement ViewCalendarVC2 as MyViewController above
setViewControllers([viewCalendarVC!], direction: .forward, animated: true, completion: nil)
}
func showCalendar(){
targetViewCalendarVC?.showCalendar()
}
//MyPageViewControllerDelegate
func viewControllerDidAppear(_ vc: UIViewController) {
setViewControllers([vc], direction: .forward, animated: false, completion: nil)
}
}
关于ios - 如何删除 UIPageViewController 中的 View Controller 之后、之前?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58856188/