【问题标题】:How to use a button created in XIB custom view to control setContentOffset in viewController.swift?如何使用在 XIB 自定义视图中创建的按钮来控制 viewController.swift 中的 setContentOffset?
【发布时间】:2019-12-29 19:34:49
【问题描述】:

我按照本教程创建了一个类似 Snapchat 的菜单:https://www.youtube.com/watch?v=1_daE3IL_1s

简而言之,这个想法是使用 XIB 创建自定义视图,并将它们添加到滚动视图中。

我想在其中一个自定义视图中添加一个“后退”按钮,以便在点击该按钮时滚动视图会自动滚动回其初始视图。我的想法是在自定义视图的 IBAction 函数中编写代码来调用 UIScrollview 的内容偏移委托函数。

以下是视图控制器中的代码:

class ViewController: UIViewController, UIScrollViewDelegate {
//I'm naming the Scroll View as "scrollView"
@IBOutlet weak var scrollView: UIScrollView! {
    didSet{
        scrollView.delegate = self
    }

}
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.

    var v1 : View1 = View1(nibName: "View1", bundle: nil)
    var v2 : View2 = View2(nibName: "View2", bundle: nil)

    self.addChild(v1)
    self.scrollView.addSubview(v1.view)
    v1.didMove(toParent: self)

    self.addChild(v2)
    self.scrollView.addSubview(v2.view)
    v1.didMove(toParent: self)

    var v2Frame : CGRect = v2.view.frame
    v2Frame.origin.x = self.view.frame.width
    v2.view.frame = v2Frame

    self.scrollView.contentSize = CGSize(width: self.view.frame.width * 2, height: self.view.frame.height)

   // self.scrollView.contentSize = CGSize(self.view.frame.width * 2, self.view.frame.size.height)
}

}

View2 中的代码如下:

class View2: UIViewController {

@IBOutlet weak var buttonHome: UIButton!
override func viewDidLoad() {
    super.viewDidLoad()
}


@IBAction func buttonHomeAction(_ sender: Any) {
    //how to access scrollview.setContentOffset from ViewController to scroll the view back to the first view?
}

所以我的问题是如何从 ViewController 访问 scrollview.setContentOffset 以将视图滚动回第一个视图?我在正确的轨道上吗?或者有没有其他方法可以让我点击一个按钮并将视图滚动回其第一页?

谢谢!

【问题讨论】:

    标签: swift xcode uiscrollview xib ibaction


    【解决方案1】:

    我可以在这里想到两个不错的选择:

    1) 在scrollViewView2 中保持弱引用。在View2 添加:

    weak var scrollView: UIScrollView?
    

    并在ViewControllerview2 创建后添加:

    view2.scrollView = self.scrollView
    

    现在,在buttonHomeAction 中,您将可以访问滚动视图。

    2) 如果你熟悉 Apple 的委托模式,你可以添加一个委托,它可以是呈现视图控制器的弱引用。

    为委托创建一个协议,使用由视图命名的委托。所以,在这种情况下:View2Delegate 并添加一个描述该操作的方法。

    protocol View2Delegate: AnyObject {
        func buttonTapped()
    }
    

    所以,在View2 中添加:

    weak var delegate: View2Delegate?
    

    并在ViewControllerview2 创建后添加:

    view2.delegate = self
    

    现在,在ViewController 中实现协议方法并访问scrollView:

    extension ViewController: View2Delegate {
        func buttonTapped() {
            // access scrollView as self.scrollView
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      • 2013-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多