我有一个委托(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/