如何使用在 XIB 自定义视图中创建的按钮来控制 viewController.swift中的 setContentOf



我按照本教程创建了一个类似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)
}

}

以下是视图 2 中的代码:

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 以将视图滚动回第一个视图?我走在正确的轨道上吗?或者是否有其他方法可以点击按钮并将视图滚动回其第一页?

谢谢!

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

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

weak var scrollView: UIScrollView?

并在ViewController中,view2创建后添加:

view2.scrollView = self.scrollView

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

2) 如果您熟悉 Apple 的委派模式,则可以添加一个委托,这可能是表示视图控制器的弱引用。

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

protocol View2Delegate: AnyObject {
func buttonTapped()
}

因此,在View2中添加:

weak var delegate: View2Delegate?

ViewController中,view2创建后添加:

view2.delegate = self

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

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

最新更新