为什么我的 UIScrollViewDelegate 没有在 swift playground 中被调用?
Why isn't my UIScrollViewDelegate being called in a swift playground?
我在 Swift Playgrounds iPad 应用程序上写了以下 playground:
import PlaygroundSupport
import UIKit
let view = UIScrollView()
view.backgroundColor = .white
view.contentSize = CGSize(width:100,height:2000)
class Foo : NSObject, UIScrollViewDelegate {
func scrollViewDidScrollToTop(_ scrollView: UIScrollView) {
print("yo")
}
}
view.delegate = Foo()
PlaygroundPage.current.liveView = view
这将创建一个滚动视图,如果您在视图上拖动手指,则可以看到其滚动条。但是 UIScrollViewDelegate 方法似乎从未被调用过。为什么?
编辑:意味着使用 scrollViewDidScroll 而不是 scrollViewDidScrollToTop。
我认为这是因为 delegate
被声明为 weak
属性。由于代码没有在其他任何地方保留对 Foo
对象的 strong
引用,因此它会立即释放它。
当我在 xcode 中尝试 运行 时,它实际上也会对此发出警告。
但是,当我保留对委托的强引用时,它起作用了。
您应该创建委托变量并将其设置为 scrollView。因为scrollView中的delegate
是弱类型
更新:scrollViewDidScrollToTop
仅在您点击状态栏时调用。如果你想跟踪滚动视图的拖动。使用 scrollViewDidScroll
代替。
import UIKit
import PlaygroundSupport
let view = UIScrollView.init(frame: CGRect(x: 0, y: 0, width: 300, height: 700))
view.backgroundColor = .white
view.contentSize = CGSize(width:100,height:2000)
class Foo : NSObject, UIScrollViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
print("yo")
}
}
let deleate = Foo()
view.delegate = deleate
PlaygroundPage.current.liveView = view
我在 Swift Playgrounds iPad 应用程序上写了以下 playground:
import PlaygroundSupport
import UIKit
let view = UIScrollView()
view.backgroundColor = .white
view.contentSize = CGSize(width:100,height:2000)
class Foo : NSObject, UIScrollViewDelegate {
func scrollViewDidScrollToTop(_ scrollView: UIScrollView) {
print("yo")
}
}
view.delegate = Foo()
PlaygroundPage.current.liveView = view
这将创建一个滚动视图,如果您在视图上拖动手指,则可以看到其滚动条。但是 UIScrollViewDelegate 方法似乎从未被调用过。为什么?
编辑:意味着使用 scrollViewDidScroll 而不是 scrollViewDidScrollToTop。
我认为这是因为 delegate
被声明为 weak
属性。由于代码没有在其他任何地方保留对 Foo
对象的 strong
引用,因此它会立即释放它。
当我在 xcode 中尝试 运行 时,它实际上也会对此发出警告。
但是,当我保留对委托的强引用时,它起作用了。
您应该创建委托变量并将其设置为 scrollView。因为scrollView中的delegate
是弱类型
更新:scrollViewDidScrollToTop
仅在您点击状态栏时调用。如果你想跟踪滚动视图的拖动。使用 scrollViewDidScroll
代替。
import UIKit
import PlaygroundSupport
let view = UIScrollView.init(frame: CGRect(x: 0, y: 0, width: 300, height: 700))
view.backgroundColor = .white
view.contentSize = CGSize(width:100,height:2000)
class Foo : NSObject, UIScrollViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
print("yo")
}
}
let deleate = Foo()
view.delegate = deleate
PlaygroundPage.current.liveView = view