gpt4 book ai didi

Swift:如何从另一个类中收听 scrollViewDidScroll

转载 作者:行者123 更新时间:2023-11-28 06:21:18 31 4
gpt4 key购买 nike

我有两个类:FooBar:

// Foo

protocol FooDelegate {
func scrollViewDidScroll(offset: CGFloat)
}

class Foo: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {

var delegate: FooDelegate?

// code truncated for brevity

func scrollViewDidScroll(_ scrollView: UIScrollView) {
delegate?.scrollViewDidScroll(offset: scrollView.contentOffset.x)
}

}


// Bar

class Bar: UIViewController, FooDelegate {

// code truncated for brevity

func scrollViewDidScroll(offset: CGFloat) {
print(offset)
}

}

我需要在 Bar 中监听 FooscrollViewDidScroll 事件。在这种情况下使用 delegates 是正确的做法吗?或者有更好的方法吗?我来自 Javascript 世界,在那里我会使用 callback 在每个 scrollViewDidScroll 事件上调用我的函数。 回调Swift 中的使用方式是否与在 Javascript 中的使用方式相同?

最佳答案

因此,正如我所说,您所设置的作为抽象该信息的解决方案是完全有效的。但是让我们看看我可能会使用的其他两种可能性。

从直接设置委托(delegate)开始。如果 scrollViewDidScroll(_ scrollView: UIScrollView) 中唯一发生的事情是调用您的委托(delegate),并且这是您正在使用的唯一 UIScrollViewDelegate 方法,那么您只需直接设置委托(delegate)即可。

class Bar: UIViewController, FooDelegate {

let foo = Foo()
func setup() {
foo.scrollView.delegate = self
}

}

如果您的对象已经非常耦合,这是一个不错的方法。尽管我在您的示例中看到您使用的是 UICollectionView,所以这可能不是您使用的唯一委托(delegate)方法。那么让我们看一下闭包。

class Foo: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {

var scrollOffSetClosure: ((offset: CGFloat) -> Void)?

// code truncated for brevity

func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollOffSetClosure(offset: scrollView.contentOffset.x)
}

}

class Bar: UIViewController, FooDelegate {

func presentFoo() {
let foo = Foo()
foo.scrollOffSetClosure = { offset in
// do something with offset
}

present(foo, animated: true, completion: nil)
}

}

您可以随时设置该属性,但我只是使用了展示下一个 viewController 并在展示之前设置闭包的示例。

关于Swift:如何从另一个类中收听 scrollViewDidScroll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43401042/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com