我在带有变量的UITableViewCell中有一个字符串。 例如:var toDoItem:String = String("名称:\(名称)和数量:\(数量)和颜色:\(颜色)"
这在tableview单元格中显示为一个字符串。 名称将添加到名称的[String]中,数量将添加到数组的int数组[Int]中,依此类推。
如果我方便删除单元格,我应该能够删除该行的名称,数量和颜色。但由于这是一个字符串,我必须能够单独访问这些变量以从相关数组中扣除。
如果给出插值字符串,我如何才能访问变量?
感谢。
答案 0 :(得分:0)
如果您的值全部采用“key:value”形式,后跟空格或字符串末尾,则此函数可能适用于您:
import Foundation
func valueFromKeyInString(key:String, string:String) -> String? {
if let keyRange = string.rangeOfString(key) {
let endIndex = string.rangeOfString(" ", options: [], range:
(keyRange.startIndex..<string.endIndex), locale: NSLocale.currentLocale())?.startIndex ??
string.endIndex
return string.substringWithRange(keyRange.endIndex..<endIndex)
}
return nil
}
// how it's used:
let string = "the name:bob and quantity:12 and color:red"
let name = valueFromKeyInString("name:", string: string) // => "bob"
let quantity = valueFromKeyInString("quantity:", string: string) // => "12"
let color = valueFromKeyInString("color:", string: string) // => "red"
然后,您可以使用这些字符串转换为您需要的值。
正则表达式也可以工作,但如果你能确定字符串的格式,这是一个相当简单的解析。当然,如果您可以访问实际值,那么您应该尝试获取这些值而不是解析字符串。
答案 1 :(得分:0)
@Carlos是对的 - 您不希望从您创建的演示文稿字符串中解析数据。您必须已将变量name
,quantity
和color
存储在cellForRowAtIndexPath
如果数据已存储在数组中,则可以在删除单元格时使用indexPath
来查找数据。
这是我之前做过的一个例子,我的数据保存在数组sourceAlbumNames
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return sourceAlbumNames.count;
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! UITableViewCell
cell.textLabel?.text = sourceAlbumNames[indexPath.row] as String
return cell
}
我猜你已经有类似的东西用于删除
func tableView(tableView: UITableView!, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath!) {
if (editingStyle == UITableViewCellEditingStyle.Delete) {
// handle delete (by removing the data from your array and updating the tableview)
sourceAlbumNames.removeAtIndex(indexPath!.row)
tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
}
}