Делегат перестает называться Swift - PullRequest
0 голосов
/ 23 июня 2019

У меня есть делегат, который я использую для запуска следующей страницы контроллера Pageview, и у меня есть 6 viewcontrollers, прикрепленных к page viewcontroller.после первых 3 вызовов в 3 разных контроллерах делегат перестает вызываться, и поэтому следующая страница контроллера страницы не запускается, ниже приведен мой код, который работает для первых 3 и перестает вызываться после первых 3

Этот код нажатия кнопки находится в 5 из контроллеров просмотра с установленным pageIndex в каждом 1..5

   weak var delegate: NextDelegate?

    nextBtn.rx.tap.asDriver().drive(onNext: {
        guard let delegate = self.delegate else {return}
        delegate.next(pageIndex: 1)
    }).disposed(by: disposeBag)

    backBtn.rx.tap.asDriver().drive(onNext: {
        guard let delegate = self.delegate else {return}
        delegate.previous(pageIndex: 1)
    }).disposed(by: disposeBag)

Мой протокол и методы

lazy var controllers: [UIViewController] = {
        let locVC = LocationVC()
        locVC.delegate = self
        let typeVC = TypeVC()
        typeVC.delegate = self
        let descVC = DescVC()
        descVC.delegate = self
        let priceVC = PriceVC()
        descVC.delegate = self
        let featuresVC = FeaturesVC()
        featuresVC.delegate = self
        let picturesVC = PicturesVC()
        picturesVC.delegate = self
        return [locVC,
                typeVC, descVC, priceVC, featuresVC, picturesVC]
    }()


func backBtnClicked(index: Int) {

    guard index - 1 >= 0 else { return }
    pageController.setViewControllers([controllers[index - 1]], direction: .reverse, animated: false, completion: nil)
}

func nextBtnClicked(index: Int) {
    log("\(controllers.count)", .happy)
    guard index + 1 < controllers.count else { return }
    pageController.setViewControllers([controllers[index + 1]], direction: .forward, animated: false, completion: nil)

}

extension ViewController: NextDelegate {
    func next(pageIndex: Int) {
        print("nexteddddd \(pageIndex)")
        nextBtnClicked(index: pageIndex)
    }

    func previous(pageIndex: Int) {
        print("backedddd \(pageIndex)")
        backBtnClicked(index: pageIndex)
    }
}

protocol NextDelegate: AnyObject {
    func next(pageIndex: Int)
    func previous(pageIndex: Int)
}

1 Ответ

0 голосов
/ 24 июня 2019

Проблема может быть связана с тем, что вы устанавливаете статический индекс 1 здесь

nextBtn.rx.tap.asDriver().drive(onNext: {
    guard let delegate = self.delegate else {return}
    delegate.next(pageIndex: 1)
}).disposed(by: disposeBag)

backBtn.rx.tap.asDriver().drive(onNext: {
    guard let delegate = self.delegate else {return}
    delegate.previous(pageIndex: 1)
}).disposed(by: disposeBag)

, вместо этого вам нужно иметь индекс var в каждом vc и назначать его при создании экземпляра vc, чтобы вы могли использовать еговыше или vaibale в главном пейджере


Исправить это

var current = 0 // assuming you set first vc initially 

 nextBtn.rx.tap.asDriver().drive(onNext: {
    guard let delegate = self.delegate else {return}
    delegate.next(pageIndex:self.current)
}).disposed(by: disposeBag)

backBtn.rx.tap.asDriver().drive(onNext: {
    guard let delegate = self.delegate else {return}
    delegate.previous(pageIndex:self.current)
}).disposed(by: disposeBag)


func backBtnClicked(index: Int) {

    guard index - 1 >= 0 else { return }
    self.current = index - 1
    pageController.setViewControllers([controllers[index - 1]], direction: .reverse, animated: false, completion: nil)
}

func nextBtnClicked(index: Int) {
    log("\(controllers.count)", .happy)
    guard index + 1 < controllers.count else { return }
    self.current = index + 1
    pageController.setViewControllers([controllers[index + 1]], direction: .forward, animated: false, completion: nil)

}
...