ios - 委托(delegate)不再被称为 swift

标签 ios swift uipageviewcontroller

我有一个委托(delegate),用于触发页面 View Controller 的下一页,并且我有 6 个 View Controller 附加到页面 View Controller 。在 3 个不同的 Controller 中的前 3 个调用之后,委托(delegate)停止被调用,因此,页面 Controller 的下一页不会被触发,下面是我的代码,它适用于前 3 个,并在第一个 3 之后停止被调用

此按钮点击代码位于 5 个 View Controller 中,每个 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)

我的协议(protocol)和方法

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)

}

关于ios - 委托(delegate)不再被称为 swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56727644/

相关文章:

objective-c - 核心数据 : model is nil while modelURL is valid

ios - 隐藏导航栏时出现奇怪的动画

ios - 在 UIPageViewController 内的 ViewController 内的 ScrollView 中检测 ScrollOffset?

iOS - 订阅自动续订后检索最新收据

ios - 委托(delegate)/协议(protocol)将数据从一个 View Controller 传递到另一个

ios - 检查来自 Alamofire 和 Swift 的多个异步响应

ios - 在 Swift 中,如何使用 NSPredicate 在包含字符串和 NSNumber 的自定义类中进行搜索?

ios - 将 UIWebView 上的 ScreenEdgePanGesture 传递给父 PageViewController

c# - Unity Share 脚本 Android 到 iOS

swift - 不等式约束以编程方式快速实现