简体   繁体   English

Swift-tableView中的可移动行仅在一个区域内,而不在两个区域之间

[英]Swift - Movable rows in tableView only within a section, not between

Is there a way to prevent cells in a tableView from being moved to a different section? 有没有一种方法可以防止tableView中的单元格移动到其他部分?

The sections have data for different types of cells, so the app crashes when the user tries to drag a cell into a different section. 这些sections具有用于不同类型的单元格的数据,因此当用户尝试将一个单元格拖到另一个部分时,应用程序将崩溃。

I would like to only allow the user to move a cell inside the section, and not in between sections. 我只想允许用户在单元内移动单元格,而不能在单元格之间移动单元格。

Relevant code is below: 相关代码如下:

override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
    return true
}

override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
    let reorderedRow = self.sections[sourceIndexPath.section].rows.remove(at: sourceIndexPath.row)
    self.sections[destinationIndexPath.section].rows.insert(reorderedRow, at: destinationIndexPath.row)

    self.sortedSections.insert(sourceIndexPath.section)
    self.sortedSections.insert(destinationIndexPath.section)
}

You will need to implement the UITableViewDelegate method targetIndexPathForMoveFromRowAt . 您将需要实现UITableViewDelegate方法targetIndexPathForMoveFromRowAt

Your strategy will be to allow the move if the source and destination section are the same. 如果源和目标section相同,则您的策略是允许移动。 If they aren't then you can return either row 0, if the proposed destination section is less than the source section or the last row of the section if the proposed destination section is greater than the source section. 如果不是,那么如果建议的目标节小于源节,则可以返回第0行,如果建议的目标节大于源节,则可以返回节的最后一行。

This will constrain the move to the source section. 这将限制移动到源代码部分。

override func tableview(_ tableView: UITableView, targetIndexPathForMoveFromRowAt sourceIndexPath: IndexPath, toProposedIndexPath proposedDestinationIndexPath: IndexPath) -> IndexPath {

    let sourceSection = sourceIndexPath.section
    let destSection = proposedDestinationIndexPath.section

    if destSection < sourceSection {
        return IndexPath(row: 0, section: sourceSection)
    } else if destSection > sourceSection {
        return IndexPath(row: self.tableView(tableView, numberOfRowsInSection:sourceSection)-1, section: sourceSection)
    }

    return proposedDestinationIndexPath
}

You can retarget the proposed destination for restriction by implementing the tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath: method 您可以通过实现tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:方法来重新定位建议的目标以进行限制

  func tableView(_ tableView: UITableView, targetIndexPathForMoveFromRowAt sourceIndexPath: IndexPath, toProposedIndexPath proposedDestinationIndexPath: IndexPath) -> IndexPath {

    // Finds number of items in source group
    let numberOfItems = self.tableView(tableView, numberOfRowsInSection: sourceIndexPath.section)

    // Restricts rows to relocation in their own group by checking source and destination sections
    if (sourceIndexPath.section != proposedDestinationIndexPath.section) {

      /*
       if we move the row to the not allowed upper area, it is moved to the top of the allowed group and vice versa
       if we move the row to the not allowed lower area, it is moved to the bottom of the allowed group
       also prevents moves to the last row of a group (which is reserved for the add-item placeholder).
      */
      let rowInSourceSection = (sourceIndexPath.section > proposedDestinationIndexPath.section) ? 0 : numberOfItems - 1;

      return IndexPath(row: rowInSourceSection, section: sourceIndexPath.section)
    }
    // Prevents moves to the last row of a group (which is reserved for the add-item placeholder).
    else if (proposedDestinationIndexPath.row >= numberOfItems) {

      return IndexPath(row: numberOfItems - 1, section: sourceIndexPath.section)
    }
    // Passing all restrictions
    return proposedDestinationIndexPath
  }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM