如何解决滑动 PageViewController 时如何更新 ViewController 中的 UIPageControl
我有三个类 OnboardingViewController
、OnboardingPageViewController
和 OnboardingContentViewController
。
在我的 ViewController 类中,我有一个 UIPageControl
,每当我按下它下面的 UIButton
“Next”时都会更新。这是按预期工作的。但是,我想根据在 UIPageControl
上向左/向右滑动的时间更新 UIPageViewController
,但我不知道该怎么做。
class OnboardingViewController: UIViewController {
@IBOutlet weak var nextButton: UIButton!
@IBOutlet weak var pageControl: UIPageControl!
var onboardingPageViewController: OnboardingPageViewController?
@IBAction func nextButtonTapped(_ sender: UIButton) {
if let index = onboardingPageViewController?.currentPageIndex {
switch index {
case 0:
onboardingPageViewController?.nextPage()
case 1:
onboardingPageViewController?.nextPage()
nextButton.setTitle("Get Started",for: .normal)
case 2:
//present login ViewController after final next button is tapped
default:
break
}
pageControl.currentPage = index + 1
}
}
override func prepare(for segue: UIStoryboardSegue,sender: Any?) {
let destination = segue.destination
if let pageViewController = destination as? OnboardingPageViewController {
onboardingPageViewController = pageViewController
}
}
}
class OnboardingContentViewController: UIViewController {
@IBOutlet var imageView: UIImageView!
@IBOutlet var titleLabel: UILabel!
@IBOutlet var introLabel: UILabel!
var index = 0
var contentTitle = ""
var intro = ""
var imageFile = ""
override func viewDidLoad() {
super.viewDidLoad()
titleLabel.text = contentTitle
introLabel.text = intro
imageView.image = UIImage(named: imageFile)
}
}
class OnboardingPageViewController: UIPageViewController,UIPageViewControllerDataSource,UIPageViewControllerDelegate {
var pageTitle = ["Title1","Title2","Title3"]
var pageIntro = ["Description1","Description2","Description3"]
var pageImages = ["image1","image2","image3"]
var currentPageIndex = 0
override func viewDidLoad() {
super.viewDidLoad()
dataSource = self
delegate = self
if let startingViewController = contentViewController(at: currentPageIndex) {
setViewControllers([startingViewController],direction: .forward,animated: true,completion: nil)
}
}
func nextPage() {
currentPageIndex += 1
if let nextViewController = contentViewController(at: currentPageIndex){
setViewControllers([nextViewController],direction:.forward,completion:nil)
}
}
func pageViewController(_ pageViewController: UIPageViewController,viewControllerBefore viewController: UIViewController) -> UIViewController? {
var index = (viewController as! OnboardingContentViewController).index
index -= 1
return contentViewController(at:index)
}
func pageViewController(_ pageViewController: UIPageViewController,viewControllerAfter viewController: UIViewController) -> UIViewController? {
var index = (viewController as! OnboardingContentViewController).index
index += 1
return contentViewController(at:index)
}
func contentViewController(at index: Int) -> OnboardingContentViewController? {
if index < 0 || index >= pageIntro.count {
return nil
}
let storyboard = UIStoryboard(name: "Onboarding",bundle: nil)
if let pageContentViewController = storyboard.instantiateViewController(withIdentifier:"OnboardingContentViewController") as? OnboardingContentViewController {
pageContentViewController.imageFile = pageImages[index]
pageContentViewController.contentTitle = pageTitle[index]
pageContentViewController.intro = pageIntro[index]
pageContentViewController.index = index
return pageContentViewController
}
return nil
}
}
我尝试将 UIPageViewController 委托方法添加到第一个视图控制器,但我发现控制台中没有打印任何内容。我错过了什么?
class OnboardingViewController: UIViewController,UIPageViewControllerDelegate {
@IBOutlet weak var pageControl: UIPageControl!
override func viewDidLoad() {
super.viewDidLoad()
let pageController = self.storyboard!.instantiateViewController(withIdentifier: "OnboardingPageViewController") as! UIPageViewController
pageController.delegate = self
}
func pageViewController(_ pageViewController: UIPageViewController,didFinishAnimating finished: Bool,previousViewControllers: [UIViewController],transitionCompleted completed: Bool) {
if completed == true {
print("change page control number")
}
}
解决方法
创建帖子通知的最简单方法 Here
var xls = tool.json2xls(data,{order:["NAME","OWNER_EMAIL","GROUP","BRAND","DOC_CENTER_URL","LIBRARYURL","TOTAL_VIEWS"],fieldMap: {NAME: "Name",OWNER_EMAIL: "Owner Email",GROUP: "Group",BRAND: "Brand",DOC_CENTER_URL: "Doc Center URL",LIBRARYURL: "Library URL",TOTAL_VIEWS: "Total Views"}});
并在 func pageViewController(_ pageViewController: UIPageViewController,viewControllerBefore viewController: UIViewController) -> UIViewController? {
var index = (viewController as! OnboardingContentViewController).index
index -= 1
// post notification here with sending index value
return contentViewController(at:index)
}
func pageViewController(_ pageViewController: UIPageViewController,viewControllerAfter viewController: UIViewController) -> UIViewController? {
var index = (viewController as! OnboardingContentViewController).index
index += 1
// post notification here with sending index value
return contentViewController(at:index)
}
的 viewDidLoad
中收听
当您执行 int
时,您正在初始化页面视图控制器的新副本。这与您的用户看到的无关。
let pageController = self.storyboard!.instantiateViewController...
相反,您需要引用添加到故事板中的现有页面视图控制器。它会自动添加为 /// no!
let pageController = self.storyboard!.instantiateViewController(withIdentifier: "OnboardingPageViewController") as! UIPageViewController
pageController.delegate = self
的第一个孩子,因此您可以使用 self.children[0]
获取它。
OnboardingViewController
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。