菜鸟教程小白 发表于 2022-12-12 22:01:06

ios - 将 Collection View 中的单元格移动到另一部分的最后一个单元格之外不起作用


                                            <p><p>为了能够在 Collection View 中移动/平移单元格,应该实现 UIGestureRecognizer。这在单节 Collection View 中工作正常。但是,在多节 Collection View 中,当一个单元格被平移/移动到另一个节的最后一个单元格之外时,会发生错误。
尽管“cellForItemAtIndexPath”在平移期间被正确触发以显示"new"单元格,但不应在平移超出最后一个可用单元格后触发(即在这种情况下 indexPath.row == numberOfItemsInSection 并导致错误(参见下面的代码)) .</p>

<p>在表格 View 中,(默认)移动/平移实现不会出现此问题。</p>

<p>这可能是 Swift 中的一个错误吗?是否有人建议在平移超出部分中的最后一个单元格时避免触发“cellForItemAtIndexPath”? </p>

<p>下面是 Swift 2.3 中的一个工作代码示例来说明问题。</p>

<pre><code>class CustomViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {

    private var list = [&#34;one&#34;, &#34;two&#34;, &#34;three&#34;,&#34;four&#34;,&#34;five&#34;,&#34;six&#34;,&#34;seven&#34;,&#34;eight&#34;]
    private var itemsList: []!

    private var collectionView : UICollectionView!

    override func viewDidLoad() {
      super.viewDidLoad()

      itemsList = // Create three sections

      collectionView = UICollectionView(frame: CGRectZero, collectionViewLayout: UICollectionViewFlowLayout())
      self.collectionView.dataSource = self
      self.collectionView.delegate = self
      self.collectionView.translatesAutoresizingMaskIntoConstraints = false
      self.collectionView.registerClass(CustomCell.self, forCellWithReuseIdentifier: &#34;cell&#34;)

      let panGesture = UIPanGestureRecognizer(target: self, action: #selector(CustomViewController.handleGesture(_:)))
      self.collectionView.addGestureRecognizer(panGesture)
      self.view.addSubview(self.collectionView)
    }

    override func viewWillLayoutSubviews() {
      let margins = view.layoutMarginsGuide
      self.collectionView.leadingAnchor.constraintEqualToAnchor(margins.leadingAnchor, constant: 0).active = true
      self.collectionView.trailingAnchor.constraintEqualToAnchor(margins.trailingAnchor, constant: 0).active = true
      self.collectionView.bottomAnchor.constraintEqualToAnchor(view.bottomAnchor, constant: 0).active = true
      self.collectionView.topAnchor.constraintEqualToAnchor(view.topAnchor, constant: 0).active = true
    }

    override func viewWillAppear(animated: Bool) {
      super.viewWillAppear(animated)
    }

    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -&gt; Int   {
      return itemsList.count
    }

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -&gt; Int {
         return itemsList.count
    }

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -&gt; UICollectionViewCell {
      let cell = collectionView.dequeueReusableCellWithReuseIdentifier(&#34;cell&#34;, forIndexPath: indexPath) as! CustomCell

      let items = itemsList

      cell.label.text = items // The error occurs here, after panning beyond the last cell of another section stating: &#34;fatal error: Index out of range&#34;
      return cell
    }

    func collectionView(collectionView: UICollectionView, canMoveItemAtIndexPath indexPath: NSIndexPath) -&gt; Bool {
      return true
    }

    func collectionView(collectionView: UICollectionView, moveItemAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) {
      let itemToMove = itemsList
      itemsList.removeAtIndex(sourceIndexPath.row)
      itemsList.insert(itemToMove, atIndex: destinationIndexPath.row)
    }


    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -&gt; CGSize {
                  return CGSizeMake(collectionView.bounds.size.width, 50)
    }

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -&gt; CGSize {
      return CGSizeMake(collectionView.bounds.size.width, 40)
    }

    func handleGesture(gesture: UIPanGestureRecognizer) {
      switch(gesture.state) {
      case UIGestureRecognizerState.Began:

            guard let selectedIndexPath = self.collectionView.indexPathForItemAtPoint(gesture.locationInView(self.collectionView)) else {
                break }
            collectionView.beginInteractiveMovementForItemAtIndexPath(selectedIndexPath)
      case UIGestureRecognizerState.Changed:
            collectionView.updateInteractiveMovementTargetPosition(gesture.locationInView(gesture.view!))
      case UIGestureRecognizerState.Ended:
            collectionView.endInteractiveMovement()
      default:
            collectionView.cancelInteractiveMovement()
      }
    }
}


class CustomCell: UICollectionViewCell {
    var label: UILabel!
    required init(coder aDecoder: NSCoder) {
      super.init(coder: aDecoder)!
    }

    override init(frame: CGRect) {
      super.init(frame: frame)
      self.backgroundColor = UIColor.whiteColor()
      self.label = UILabel()
      self.label.translatesAutoresizingMaskIntoConstraints = false
      self.contentView.addSubview(self.label)
    }

    override func layoutSubviews() {
      super.layoutSubviews()
      let margins = self.contentView.layoutMarginsGuide
      self.label.leadingAnchor.constraintEqualToAnchor(margins.leadingAnchor).active = true
      self.label.trailingAnchor.constraintEqualToAnchor(margins.trailingAnchor).active = true
      self.label.centerYAnchor.constraintEqualToAnchor(self.contentView.centerYAnchor).active = true
    }
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>根据 Apple 的说法,我的问题中描述的问题是 iOS 中的一个错误,并且似乎在当前版本的 iOS 10 beta (xcode 8 GM) 中得到了解决。</p>

<p>不幸的是, Collection View 的其他问题尚未修复,例如将项目移动到空白部分的基本支持。 </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 将 Collection View 中的单元格移动到另一部分的最后一个单元格之外不起作用,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/39318624/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/39318624/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 将 Collection View 中的单元格移动到另一部分的最后一个单元格之外不起作用