全部,你能给我下面问题的源代码吗?
我有100个用户数组,并在表视图中加载该数组值(用户名)。
场景:
当我点击任何tableviewcell时,我会将该值存储在新数组(userArray)中,并且我会显示右侧的discloser(选中标记)。但我的问题是,当我再次单击以从表单元格中取消选择该用户时,我的应用程序已因索引越界而崩溃。
我知道问题出在索引之外,但我该如何解决这个问题,所以如果我再次单击该表单元格,它将从userArray中删除用户,并获得新的新userArray?
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let tagValue = 100 + indexPath.row
let cell: UITableViewCell = tableView.viewWithTag(tagValue) as UITableViewCell
if cell.accessoryType == UITableViewCellAccessoryType.None
{
cell.accessoryType = UITableViewCellAccessoryType.Checkmark
userToSendPost.append(self.users2[indexPath.row])
} else {
cell.accessoryType = UITableViewCellAccessoryType.None
let tempString = userToSendPost[indexPath.row] //tagvalue
let objcArray = userToSendPost as NSArray
let indexOfObject = objcArray.indexOfObject(tempString)
userToSendPost.removeAtIndex(indexPath.row)
}
}
抱歉我英语不好。
您对此处理不正确。
在表视图上设置属性tableView.allowsMultipleSelection = true
。
然后,当您想要获取所选用户时。。。
let selectedIndexPaths = tableView.indexPathsForSelectedRows()
然后,您可以使用这些索引路径中的row
属性来查找用户。
var selectedUsers: [User] = []
for indexPath in selectedIndexPaths {
let user = theUsers[indexPath.row]
selectedUsers.append(user)
}
多选和复选标记由表视图自动处理。
要遵循您的方法,我认为这可能会对您有所帮助;)
但是@Fogmeister的方法更好!
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let tagValue = 100 + indexPath.row
let cell: UITableViewCell = tableView.viewWithTag(tagValue) as UITableViewCell
if cell.accessoryType == UITableViewCellAccessoryType.None
{
cell.accessoryType = UITableViewCellAccessoryType.Checkmark
userToSendPost.append(self.users2[indexPath.row])
} else {
let tempUserString = self.users2[indexPath.row] // get your user string
if contains(userToSendPost, tempString) { // check if exist on your array
userToSendPost.removeObject(tempString) // remove it
}
cell.accessoryType = UITableViewCellAccessoryType.None
}
}
// If you want to use Array, add this method
extension Array {
mutating func removeObject<U: Equatable>(object: U) {
var index: Int?
for (idx, objectToCompare) in enumerate(self) {
if let to = objectToCompare as? U {
if object == to {
index = idx
}
}
}
if(index != nil) {
self.removeAtIndex(index!)
}
}
}