您好,有一个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
}
答案 0 :(得分:0)
查看func tableView(_ tableView: UITableView, willDeselectRowAt indexPath: IndexPath) -> IndexPath?
委托方法。如果您不希望用户实际取消选择该行,则可以在此处返回nil(然后也可以显示警报)。
(此外,您不应该在self.tableView.selectRow
方法内调用self.tableView.deselectRow
或cellForRowAt
。请访问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
}
}
另外,我认为更好的方法是允许用户取消全部选择,并检查使视图转移到另一个按钮的选择计数。