【问题标题】:Get type of UIScrollView inside UIScrollViewDelegate methods在 UIScrollViewDelegate 方法中获取 UIScrollView 的类型
【发布时间】:2020-04-26 18:25:22
【问题描述】:

我有一个UIViewController,其中有UITableViewUICollectionView。我想在滚动UICollectionView 时执行某些任务。

我已经扩展了UIScrollViewDelegate 并在

中编写了我的代码

func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView)

但是当UITableViewUICollectionView 都被滚动时调用这个方法。我如何区分这两种观点?我试过了

  func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {

    if let cv = scrollView as? UICollectionView {

    }
  }

但它不起作用。我试过po scrollView,输出是<uninitialized>

【问题讨论】:

  • 您的尝试现在效果如何?您是否将delegate 设置为self
  • delegate UICollectionView?我没有专门设置该委托,但在 UITableViewUICollectionView 上都调用了委托方法
  • 这怎么可能?你怎么知道委托方法被调用了?如果他们被调用,你怎么知道你的if let 语句不起作用?
  • 我在delegate 方法中设置了断点,如果我删除if 语句,里面的代码会在UITableViewUICollectionView 滚动时执行。
  • 您所要做的就是使用具有快速枚举的isKind 协议。

标签: ios swift xcode uiscrollview uiscrollviewdelegate


【解决方案1】:

// 说 tv 和 cv 是 table View 和 Collection View 的出口

目标 c

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView == self.tv) {
        self.tv.contentOffset = self.tv.contentOffset;
    } else if (scrollView == self.cv) {
        self.cv.contentOffset = self.cv.contentOffset;
    }
}

斯威夫特

func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {

    if let scrollView == tv {
         //do whatever you need with tableView
    }
    if let scrollView == cv {
        //do whatever you need with collectionView
    }

  }

【讨论】:

    【解决方案2】:

    这是我的错误,但对于其他人,我会在这里发布答案。

    当滑块完成拖动/滚动时,我需要执行我的代码。为了实现这一点,我有

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
    
        NSObject.cancelPreviousPerformRequests(withTarget: self)
        perform(#selector(UIScrollViewDelegate.scrollViewDidEndScrollingAnimation), with: nil, afterDelay: 0.3)
    }
    

    有问题

    perform(#selector(UIScrollViewDelegate.scrollViewDidEndScrollingAnimation), with: nil, afterDelay: 0.3)
    

    我没有传递 nil,而是写了

    perform(#selector(UIScrollViewDelegate.scrollViewDidEndScrollingAnimation), with: scrollView afterDelay: 0.3)
    

    这就解决了。我不再收到scrollView <uninitialized> 和我的

    if let cv = scrollView as? UICollectionView {
    
    }
    

    工作正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 2010-10-08
      相关资源
      最近更新 更多