在不同的ViewControllers中移动两个ScrollView

时间:2017-02-01 06:42:13

标签: ios swift uiviewcontroller uiscrollview

我有以下问题,我正在建立一个学校日程表,我有2个viewControllers,每个都有scrollView。在viewController“Bloques”中,我在列表的一侧有一个containerView(列表在scrollView中),它将包含“Dias”viewController,这个想法是当我在一天之内使用分页切换到另一天时Dias“,不要移动bloques列表。问题是列表太长了,所以我在两个viewController中都使用了scrollView,它们具有相同的帧数,然后当我在Y轴上滚动例如“Bloques”时,我希望它也可以在“Dias”scrollView。在另一个项目中我做了类似的事情,但在同一个viewController中,这并没有引起我的主要复杂情况,但是在不同的viewControllers中会产生以下错误:

致命错误:在解包可选值时意外发现nil:

错误: Screenshot

viewControllers的结构:

Screenshot

BLOQUES

@IBOutlet weak var bloquesScrollView: UIScrollView!

override public func viewDidLoad() {
    super.viewDidLoad()
    bloquesScrollView.delegate = self
}

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView.restorationIdentifier == "bloques" {
        let ejey = bloquesScrollView.contentOffset.y
        let pruebaController: prueba = prueba()
        pruebaController.mover(y: Int(ejey))
    }
}

DIAS

@IBOutlet weak var diasScrollView: UIScrollView!

func mover(y: Int?) {
    print("casi \(y)")
    diasScrollView.setContentOffset(CGPoint(x: 0, y: y!), animated: false)
}
override func viewDidLoad() {
    super.viewDidLoad()
    diasScrollView.delegate = self
}

更正问题,我寻找一种方法,其中包含与UIViewController“Bloques”中的块相对应的ScrollView的不同UIViewController(星期一,Tuestaday等),如果它们也将移动信号提供给“Blocks”的ScrollView移动,反之亦然。 应该提到星期一,星期二等等都包含在“Bloques”的容器视图中。 我理解Container View控制器管理一个视图就像任何其他UIViewController子类一样,在这种情况下,中间的图像是Container View的UIViewController,它将在周一,周二等运行。之前我意识到的是一个列表“Bloques”位于每个UIViewController(周一,周二等)内部,因此更容易实现,但视图很奇怪,因为列表应该是静态的而不是移动并在下一页再次出现(从星期一开始)以星期二为例)。我不知道是否有比我提议的方法更简单的方法。

New Situation

1 个答案:

答案 0 :(得分:0)

修改

问题在于,您的第一个代码let pruebaController: prueba = prueba()会创建一个全新的prueba实例。这与具有scrollView的prueba不同,因此其scrollView为nil,当您尝试使用它时会崩溃。

请尝试此代码..

<强> BLOQUES

@IBOutlet weak var bloquesScrollView: UIScrollView!

override public func viewDidLoad() {
    super.viewDidLoad()
    bloquesScrollView.delegate = self
}

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView.restorationIdentifier == "bloques" {
        let ejey = bloquesScrollView.contentOffset.y

        // try this code....
        let vc = UIStoryboard(name: '<Here Your storyboard name (default : "main">', bundle: nil)
                 .instantiateViewController(withIdentifier: '<Here Your DIAS Identifier>') as! prueba
        vc.mover(y: Int(ejey))
    }
}