Изменить PageControl в ContainerView через IBAction в родительском представлении - PullRequest
0 голосов
/ 28 апреля 2020

Я довольно новичок в Swift, и поэтому у меня довольно серьезная проблема c, но я не могу найти ответ на нее. У меня есть ViewController с представлением контейнера. Контроллер страниц встроен в представление контейнера, и я могу прокручивать различные страницы, но проблема, с которой я столкнулся, заключается в том, что я хочу изменить страницы, основываясь на кнопке, которую я нажимаю в ViewController.

Это мой код для моего PageController:

var pageIndex = 0

class FirstViewController: UIViewController {

    @IBOutlet weak var FirstButton: UIButton!
    @IBOutlet weak var SecondButton: UIButton!
    @IBOutlet weak var currentView: UIView!

    override func viewDidLoad() {
            super.viewDidLoad()
        }
    @IBAction func FirstButtonAction(_ sender: Any) {
        SecondButton.backgroundColor = UIColor.black
        SecondButton.setTitleColor(.white, for: .normal)

        FirstButton.backgroundColor = UIColor.white
        FirstButton.setTitleColor(.black, for: .normal)

         pageIndex = 0

    }

    @IBAction func SecondButtonAction(_ sender: Any) {

        FirstButton.backgroundColor = UIColor.black
        FirstButton.setTitleColor(.white, for: .normal)

        SecondButton.backgroundColor = UIColor.white
        SecondButton.setTitleColor(.black, for: .normal)

         pageIndex = 1

    }
}
class PageViewController: UIPageViewController, UIPageViewControllerDataSource {

    lazy var viewControllerList:[UIViewController] = {

        let sb = UIStoryboard(name: "Main", bundle: nil)

        let vc1 = sb.instantiateViewController(withIdentifier: "FirstVC")
        let vc2 = sb.instantiateViewController(withIdentifier: "SecondVC")

        return [vc1, vc2]

    }()


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

    guard let vcIndex = viewControllerList.firstIndex(of: viewController) else {return nil}

        pageIndex = vcIndex - 1

        guard pageIndex >= 0 else {return nil}
        guard viewControllerList.count > 0 else {return nil}

        return viewControllerList[pageIndex]

    }

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

         guard let vcIndex = viewControllerList.firstIndex(of: viewController) else {return nil}

        pageIndex = vcIndex + 1

        guard viewControllerList.count != pageIndex else {return nil}
        guard viewControllerList.count > pageIndex else {return nil}

        return viewControllerList[pageIndex]
    }


    override func viewDidLoad() {
        super.viewDidLoad()

        self.dataSource = self



        if let firstViewController = viewControllerList.first {
            self.setViewControllers([firstViewController], direction: .forward, animated: true, completion: nil)

        }
    }

В основном это поиск в Google и видео на YouTube, поэтому, если мой код выглядит нестабильным где-либо еще, пожалуйста, скажите мне, как почини это. Любые рекомендации?

Изображения, показывающие вид результата, который я ищу (довольно просто, наверное):

ОБНОВЛЕНИЕ: Я пытался добавить это, но это не сработало:

@IBAction func SecondButtonAction(_ sender: Any) {

guard let currentViewController = 
PageViewController().viewControllerList.first else { return }

guard let nextViewController = 
PageViewController().dataSource?.pageViewController(PageViewController(), viewControllerAfter: currentViewController) else { return } 

PageViewController().setViewControllers([nextViewController], direction: .forward, animated: false, completion: nil)
}

image 1

image 2

1 Ответ

0 голосов
/ 28 апреля 2020

Вы можете использовать setViewControllers:direction:animated:completion: для переключения страниц при нажатии кнопки.

    @IBAction func btnNextTapped(_ sender: Any) {
           guard let currentViewController = pageView.viewControllers?.first else { return }
           guard let nextViewController = pageView.dataSource?.pageViewController(pageView, viewControllerAfter: currentViewController) else { return }
           pageView.setViewControllers([nextViewController], direction: .forward, animated: false, completion: nil)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...