scrollViewDidScroll没有被调用(我设置了代理!)

时间:2018-11-11 11:31:37

标签: ios swift uiscrollview uiscrollviewdelegate

情况: 我正在创建一个imageGallery,它是我模态呈现的viewController。我已经以编程方式创建了所有内容,但没有触及情节提要。 viewController有一个scrollView,其中包含ImageViews,每个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")
}

搞定了。

3 个答案:

答案 0 :(得分:1)

您的问题来自具有private委托方法的scrollViewDidScroll:访问级别关键字。 UIScrollViewDelegateNSObject,由于该方法是私有的,因此它看不到该方法,因此不调用委托方法。当您的课程是公开的时,您需要使用public访问级别声明该方法。

只需尝试一下:

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

答案 1 :(得分:1)

删除私人关键字

func scrollViewDidScroll(_ scrollView: UIScrollView)

答案 2 :(得分:0)

我错过了一个!

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

解决了这个问题。