繁体   English   中英

代表停止被称为swift

[英]Delegate stops being called swift

我有一个委托,我用它来触发Pageview控制器的下一页,我有6个viewcontrollers连接到页面viewcontroller。 在3个不同控制器中的前3个调用之后,代理停止被调用,因此,页面控制器的下一页未被触发,beleow是我的代码,它适用于前3个并且在前3个后停止调用

此Button按钮代码位于5个视图控制器中,每个1..5中都设置了pageIndex

   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有关

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)

相反,您需要在每个vc中都有一个索引var,并在实例化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)

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM