簡體   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