scrollViewDidScroll 没有被调用(我设置了委托!)
scrollViewDidScroll not getting called (I set the delegate!)
情况:
我正在创建一个 imageGallery,它是我以模态方式呈现的 viewController。我已经以编程方式创建了它,我没有触及情节提要。
viewController 有一个包含 ImageView 的 scrollView,每个 ImageView 都有一个图像。我已经设置 scrollView.isPagingEnabled = true
并且它按预期工作,我可以很好地滚动浏览图像。
问题:
当 scrollView 滚动时,我正在尝试做一些工作。我已经设置了委托(这似乎是人们在搜索答案时遇到的主要问题)但是 scrollViewDidScroll
从未被调用过。
我完全不知所措 happening.I 已经尝试了很多不同的东西,但现在 运行 没有想法
@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")
}
成功了。
您的问题来自 private
访问级别关键字和 scrollViewDidScroll:
委托方法。 UIScrollViewDelegate
是一个 NSObject
并且由于该方法是私有的,它看不到该方法,因此不会调用委托方法。由于您 class 是 public,您需要使用 public
访问级别声明该方法。
试试这个:
public func scrollViewDidScroll(_ scrollView: UIScrollView) {
print("delegate")
}
删除私有关键字
func scrollViewDidScroll(_ scrollView: UIScrollView)
我漏了一个 !
private func scrollViewDidScroll(_ scrollView: UIScrollView!) {
print("delegate")
}
问题已解决。
情况:
我正在创建一个 imageGallery,它是我以模态方式呈现的 viewController。我已经以编程方式创建了它,我没有触及情节提要。
viewController 有一个包含 ImageView 的 scrollView,每个 ImageView 都有一个图像。我已经设置 scrollView.isPagingEnabled = true
并且它按预期工作,我可以很好地滚动浏览图像。
问题:
当 scrollView 滚动时,我正在尝试做一些工作。我已经设置了委托(这似乎是人们在搜索答案时遇到的主要问题)但是 scrollViewDidScroll
从未被调用过。
我完全不知所措 happening.I 已经尝试了很多不同的东西,但现在 运行 没有想法
@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")
}
成功了。
您的问题来自 private
访问级别关键字和 scrollViewDidScroll:
委托方法。 UIScrollViewDelegate
是一个 NSObject
并且由于该方法是私有的,它看不到该方法,因此不会调用委托方法。由于您 class 是 public,您需要使用 public
访问级别声明该方法。
试试这个:
public func scrollViewDidScroll(_ scrollView: UIScrollView) {
print("delegate")
}
删除私有关键字
func scrollViewDidScroll(_ scrollView: UIScrollView)
我漏了一个 !
private func scrollViewDidScroll(_ scrollView: UIScrollView!) {
print("delegate")
}
问题已解决。