Array: Swift and IOS



全部,你能给我下面问题的源代码吗?

我有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!)
            }
        }
}

最新更新