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

Posted

技术标签:

【中文标题】为啥我的 UIScrollViewDelegate 没有在快速操场上被调用?【英文标题】:Why isn't my UIScrollViewDelegate being called in a swift playground?为什么我的 UIScrollViewDelegate 没有在快速操场上被调用? 【发布时间】:2019-09-03 03:20:04 【问题描述】:

我在 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。

【问题讨论】:

【参考方案1】:

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

当我尝试在 xcode 中运行它时,它实际上也给出了警告。

但是,当我保持对委托的强引用时,它会起作用。

【讨论】:

我尝试将 Foo() 保存在像 let foo = Foo(); view.delegate = foo 这样的变量中,但这并没有什么不同。这不是一个强有力的参考吗? 恐怕不行。当您将它分配给一个变量时,它是一个强引用,但是一旦上下文结束,引用也会减少,此时它只有 weak 委托引用指向它。我能够创建强引用的方法是在 ViewController 中保留引用(我在 xCode 应用程序中运行它) 看起来确实有很强的参考价值。它似乎不起作用的原因是因为我不小心写了scrollViewDidScrollToTop而不是scrollViewDidScroll,所以我滚动时它没有做任何事情。【参考方案2】:

您应该创建委托变量并设置为滚动视图。因为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

【讨论】:

@tbodt 我只是将scrollViewDidScrollToTop 更改为scrollViewDidScroll。代表工作完美

以上是关于为啥我的 UIScrollViewDelegate 没有在快速操场上被调用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 `-[UILabel setText:]` 会泄漏?

未调用 UIScrollViewDelegate 函数

ios11 中uicollectionview reloaddata 为啥页面会滑动一下

UIScrollViewDelegate 没有触发

从 UITableView 的子类访问 UIScrollViewDelegate

如何使用 UIScrollViewDelegate 方法重新实现 UIScrollView 分页