现我的资料 可以用tablveiw.reloaddata来更新,现在想用reloadAtindexPaths 或 insertrowsatindexpaths 来作画作效果,但怎么作都是错的,(如程式注解处),正确写法应该如何写呢?
var tmpRow:Int = IndexPath.row
if let child:NSMutableArray = rtnChildArray(catno) {
for j in child {
tmpRow++
let tCateDictionary = NSMutableDictionary()
tCateDictionary.setValue(j.objectForKey("Level"), forKey: "Level")
tCateDictionary.setValue(j.objectForKey("catno"), forKey: "catno")
tCateDictionary.setValue(j.objectForKey("cat_name"), forKey: "cat_name")
tCateDictionary.setValue(false, forKey: "open")
tableCateArry.insertObject(tCateDictionary, atIndex: tmpRow)
// cateTableView.beginUpdates()
//cateTableView.reloadRowsAtIndexPaths([IndexPath], withRowAnimation: .Left)
//cateTableView.reloadRowsAtIndexPaths([NSIndexPath(forRow: tmpRow, inSection: IndexPath.section)], withRowAnimation: .Left)
//cateTableView.endUpdates()
}
}
cateTableView.reloadData()
另有关 NSMuableArray转型的问题
现在一个NSMutablArray
for i in CateArray {
print(i.objectForKey("catno") ) //得到 optional(17)
print(i["catno"]) //得到 Optional(17)
print((i["catno"] as! NSString).integerValue) //得到 17
print(i.objectForKey("catno") as! Int) //错误 Could not cast value of type '__NSCFString' (0x863da4) to 'NSNumber' (0xc69800).
print(i.objectForKey("catno") as! NSInteger) //得到跟上面一样的讯
}
难道 一定要转string 后,才能转int 吗(我个人是不相信会有那么不人性的程式语言)
另外,有没有关于 各型态转型 这方面的知识的网站可以提供的
我常常在 AnyOject , NSMuiltableDictionary, NSMutableArray,json 的格式转换间,卡非常非常的久
第一个 table 更新数据的问题:不知道你遇到的具体问题是什么,但是看你写的代码里有两个小问题:
如果使用了
insertRowsAtIndexPaths
,reloadRowsAtIndexPaths
,就没有必要再reloadData
了,你需要注意这三者之间的区别, 第一个 insertRowsAtIndexPaths 是说加入新的数据,比如说一个 table 里本来显示了 3 条记录,现在我新插入两条,变成 5 条,这种时候调用 insertRowsAtIndexPaths。第二个 reloadRowsAtIndexPaths 是说 table 里的某些条数据有了更新,需要重新加载一下这些 cell,比如说第二条记录的 level 由 1 变成 2 了,这时候你需要调用一下 reloadRowsAtIndexPaths 来刷新相应的 cell。第三个 reloadData 是重新加载整个 table,一般来说是整个数据源都变了的情况才调用这个。在你的代码里重复地调用了第二个和第三个 reload 函数。看你的代码应该是想往 table 里加入新的 cell,但是
tableCateArry.insertObject(tCateDictionary, atIndex: tmpRow)
往数据源里 insert 数据之后,确实调用了reloadRowsAtIndexPaths
,根据上面的分析,这里应该是使用insertRowsAtIndexPaths
。另外,你的刷新操作是在 for 循环里面做的,可以把它拿到外面来统一进行,使用 for 循环构建需要插入的 indexPaths 数组,然后在 for 循环完成后,统一调用一次insertRowsAtIndexPaths
即可。第二个问题:NSDictionary, NSArray 等 NS 开头的类型都是旧 objective c 里的类型,它们对于泛型支持的较弱,所有的东西读出来都是 AnyObject?,所以会遇到很多转型的问题。推荐你用 swift 里的 Array,Dictionary 替代,它们对泛型有很好的支持,里面存的东西的类型都是已知的,不用各种转换,举个例子:
如果你最初拿到的是 json 格式的数据,那你可能会遇到把 json 转换成具体的对象的问题,这个你可以看一下 ObjectMapper。
以上这样,在具体的使用的地方,就会是很清晰的类型,避免了各种转换(或者至少把转换的逻辑模块化了,不会到处都是转换的代码)。