为什么我的UIScrollViewDelegate没有在快速的操场上被调用?

时间:2019-09-03 03:20:04

标签: ios swift uikit swift-playground

我在Swift Playgrounds iPad应用程序上编写了以下游乐场:

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。

2 个答案:

答案 0 :(得分:2)

我认为这是因为delegate被声明为weak属性。由于代码没有在其他任何地方保留对strong对象的Foo引用,因此它将立即对其进行释放。

当我尝试在xcode中运行此命令时,实际上也会对此发出警告。

但是,当我对代理人保持强烈引用时,它就会起作用。

答案 1 :(得分:1)

您应该创建委托变量并将其设置为scrollView。因为scrollView中的delegate是弱类型

更新:scrollViewDidScrollToTop仅在您点击状态栏时调用。如果要跟踪scrollview的拖动。改用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