scrollViewDidScroll не вызывается (я установил делегата!) - PullRequest
0 голосов
/ 11 ноября 2018

Положение: Я создаю imageGallery, которая является viewController, который я представляю модально. Я создал все это программно, я не касался раскадровки. ViewController имеет 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")
}

Сделал трюк.

Ответы [ 3 ]

0 голосов
/ 11 ноября 2018

Удалить приватное ключевое слово

func scrollViewDidScroll(_ scrollView: UIScrollView)
0 голосов
/ 11 ноября 2018

Мне не хватало!

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

Решил проблему.

0 голосов
/ 11 ноября 2018

Вы получаете из ключевого слова private уровень доступа с методом делегата scrollViewDidScroll:. UIScrollViewDelegate - это NSObject, и поскольку метод является закрытым, он не может видеть метод, и поэтому метод делегата не вызывается. Поскольку ваш класс является общедоступным, вам необходимо объявить метод с уровнем доступа public.

Просто попробуйте это:

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