在UITableView中至少选择一行

时间:2019-03-10 10:11:43

标签: ios swift uitableview

您好,有一个UITableView,它具有检查/取消选中每一行的选项。它工作正常,否,我想确保选择了至少一行,并且当用户尝试取消选中该行时,向他显示警告,提示必须选择至少一个选项。我该如何实现?

这是当前代码

private var locationToDisplay = [Location]();
override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.dataSource=self
    self.tableView.delegate=self
    self.tableView.allowsMultipleSelection = true
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return locationToDisplay.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "SubscriptionCell", for: indexPath) as! SubscriptionTableViewCell
    let cellLocation = locationToDisplay[indexPath.row]
    cell.labelLocation.text = cellLocation.location_name

    if cellLocation.subscribed == 1 {
        self.tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
    } else {
        self.tableView.deselectRow(at: indexPath, animated: false)
    }
    return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
       locationToDisplay[indexPath.row].subscribed = 1
}

override func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
    if (countSelections()==1) {
        //Last checked item
    }

       locationToDisplay[indexPath.row].subscribed = 0
}

func countSelections()->Int {
    var count: Int = 0
    for location in locationToDisplay {
        if (location.subscribed == 1) {
            count = count + 1
        }
    }
    return count
}

3 个答案:

答案 0 :(得分:0)

查看func tableView(_ tableView: UITableView, willDeselectRowAt indexPath: IndexPath) -> IndexPath?委托方法。如果您不希望用户实际取消选择该行,则可以在此处返回nil(然后也可以显示警报)。

(此外,您不应该在self.tableView.selectRow方法内调用self.tableView.deselectRowcellForRowAt。请访问https://stackoverflow.com/a/13827975/403425以获得更多帮助。)

答案 1 :(得分:0)

您可以像这样利用'UITableViewDelegate'willDeselectRowAt方法:

func tableView(_ tableView: UITableView, willDeselectRowAt indexPath: IndexPath) -> IndexPath? {
    guard tableView.indexPathsForSelectedRows?.count ?? 0 == 1 else { return indexPath}

    let alertController = UIAlertController(title: "Error", message: "You must keep at least one cell selected", preferredStyle: .alert)
    alertController.addAction(UIAlertAction(title: "Ok", style: .default, handler: nil))
    self.present(alertController, animated: true, completion: nil)

    return nil
}

答案 2 :(得分:0)

通过实施didDeselect,用户最多可以检查一个单元格。
您可以检查是否选中了该行,取消选中该行:(因为didDeselect自动触发)

override func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
    if (countSelections()==1) {
        //Last checked item
    }
    if (locationToDisplay[indexPath.row].subscribed == 1) {
       locationToDisplay[indexPath.row].subscribed = 0
    }
}

您还可以删除此替代并处理didSelect中的单元格选择和取消选择。

您可以通过这种方式查看所需内容:

首先,您应该检查是否有第一项被选中(在viewDidLoad中声明):firstTime = true

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if (!firstTime) {
        if (countSelections() > 1) {
            if (locationToDisplay[indexPath.row].subscribed == 1) {
                locationToDisplay[indexPath.row].subscribed = 0
            } else {
                locationToDisplay[indexPath.row].subscribed = 1
            }
        }
    } else {
      locationToDisplay[indexPath.row].subscribed = 1
      firstTime = false
    }
}

另外,我认为更好的方法是允许用户取消全部选择,并检查使视图转移到另一个按钮的选择计数。