scrollViewDidScroll 没有被调用(我设置了委托!)

Posted

技术标签:

【中文标题】scrollViewDidScroll 没有被调用(我设置了委托!)【英文标题】:scrollViewDidScroll not getting called (I set the delegate!) 【发布时间】:2018-11-11 11:31:36 【问题描述】:

情况: 我正在创建一个 imageGallery,它是我以模态方式呈现的 viewController。我以编程方式创建了这一切,我没有触及故事板。 viewController 有一个包含 ImageViews 的 scrollView,每个 ImageViews 都包含一个图像。我设置了scrollView.isPagingEnabled = true,它按预期工作,我可以很好地滚动图像。

问题: 当 scrollView 滚动时,我正在尝试做一些工作。我已经设置了委托(这似乎是人们在寻找答案时遇到的主要问题),但 scrollViewDidScroll 从未被调用。 我对正在发生的事情完全不知所措。我尝试了很多不同的东西,但现在已经没有想法了

@objc public class ImageGallery: UIViewController, UIScrollViewDelegate 

// MARK:- VARIABLES

/// An array of imageItems
@objc public var galleryItems = [ImageGalleryItem]()

/// The index of the image the gallery should start at
@objc public var startingIndex: NSNumber?

/// The UIImage to display if there is an error
@objc public var errorImage: UIImage?

/// The UIImage to display if the ImageGalleryItem doesn't have an image
@objc public var defaultImage: UIImage?

var scrollView: UIScrollView!

// MARK:- INITS

/// Initialiser for ImageGallery passing an array of ImageGalleryItems
///
/// - Parameter ImageGalleryItems: an array of ImageGalleryItems
@objc public init() 

    self.defaultImage = UIImage(named: "default", in: getResourceBundle(), compatibleWith: nil)!
    self.errorImage = UIImage(named: "error", in: getResourceBundle(), compatibleWith: nil)!
    super.init(nibName:nil, bundle:nil)



@objc public required init?(coder aDecoder: NSCoder) 
    super.init(coder: aDecoder);



// MARK:- VIEW LIFECYCLES
override public func viewDidLoad() 

    super.viewDidLoad()

    configureScrollView()

    self.scrollView.delegate = self
    configureImageViews()
    configurePresentationDefaults()



func configureScrollView() 

    self.scrollView = UIScrollView(frame: view.frame)

    self.scrollView.isPagingEnabled = true
    self.scrollView.contentOffset = CGPoint(x: CGFloat(truncating: startingIndex ?? 0) * UIScreen.main.bounds.width, y: 0)

    let imagesCount = galleryItems.count
        let contentWidth = CGFloat(imagesCount) * UIScreen.main.bounds.width
        self.scrollView.contentSize = CGSize(width: contentWidth, height: UIScreen.main.bounds.height)


    if let toolbar = configureToolBar() 

        view.addSubview(self.scrollView)
        view.addSubview(toolbar)
        view.bringSubviewToFront(toolbar)
    


private func scrollViewDidScroll(_ scrollView: UIScrollView) 
    print("delegate")

更新

我错过了一个!

private func scrollViewDidScroll(_ scrollView: UIScrollView!) 
    print("delegate")

成功了。

【问题讨论】:

【参考方案1】:

删除私有关键字

func scrollViewDidScroll(_ scrollView: UIScrollView)

【讨论】:

是的,我已经尝试过了,我只添加了private,因为 xcode 显示警告。 仅供参考,Xcode 10.2.1(具有 Swift 5)有一个错误,如果您将 Swift Compilation Mode 设置为 Incremental builds,则不会调用此函数。答案是在函数前加上@objc。见***.com/questions/55592341/…【参考方案2】:

您的问题来自private 访问级别关键字和scrollViewDidScroll: 委托方法。 UIScrollViewDelegateNSObject 并且由于该方法是私有的,因此无法看到该方法,因此不调用委托方法。由于您的类是公开的,因此您需要使用 public 访问级别声明该方法。

试试这个:

public func scrollViewDidScroll(_ scrollView: UIScrollView) 
    print("delegate")

【讨论】:

是的,我已经尝试过了,我只添加了private,因为 xcode 显示警告。它没有改变任何东西 我没有注意到你的类是public,所以你也需要将委托方法声明为public。我已经编辑了帖子。 private func scrollViewDidScroll(_ scrollView: UIScrollView!) 解决了这个问题 您使用的是哪个 swift 版本?因为 API 签名没有!。见developer.apple.com/documentation/uikit/uiscrollviewdelegate/…【参考方案3】:

我错过了一个!

private func scrollViewDidScroll(_ scrollView: UIScrollView!) 
    print("delegate")

解决了这个问题。

【讨论】:

您好,抱歉,我正在向您发送不相关的文章 - 但我无法找到与您联系的方式。我和你一样的查尔斯有同样的错误。你解决了这个问题吗? webcache.googleusercontent.com/…

以上是关于scrollViewDidScroll 没有被调用(我设置了委托!)的主要内容,如果未能解决你的问题,请参考以下文章

scrollViewDidScroll 在上下滚动 tableview 时被调用 tablecell 内的 uiscrollview

“覆盖func scrollViewDidScroll”多次调用。我只想打电话一次

我的应用调用 scrollViewDidScroll 19 次

ScrollViewDelegate 不调用 scrollViewDidScroll 或 scrollViewWillBeginDragging

用奇怪的 contentOffsetY 调用 scrollViewDidScroll

UICollectionView 调用 scrollViewDidScroll:从导航堆栈中弹出时