swfit - 有关 新增cells into tableview 动画问题,及Anyobjce转型问题

查看:172
本文介绍了swfit - 有关 新增cells into tableview 动画问题,及Anyobjce转型问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

现我的资料 可以用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 更新数据的问题:不知道你遇到的具体问题是什么,但是看你写的代码里有两个小问题:

  1. 如果使用了 insertRowsAtIndexPathsreloadRowsAtIndexPaths,就没有必要再 reloadData 了,你需要注意这三者之间的区别, 第一个 insertRowsAtIndexPaths 是说加入新的数据,比如说一个 table 里本来显示了 3 条记录,现在我新插入两条,变成 5 条,这种时候调用 insertRowsAtIndexPaths。第二个 reloadRowsAtIndexPaths 是说 table 里的某些条数据有了更新,需要重新加载一下这些 cell,比如说第二条记录的 level 由 1 变成 2 了,这时候你需要调用一下 reloadRowsAtIndexPaths 来刷新相应的 cell。第三个 reloadData 是重新加载整个 table,一般来说是整个数据源都变了的情况才调用这个。在你的代码里重复地调用了第二个和第三个 reload 函数。

  2. 看你的代码应该是想往 table 里加入新的 cell,但是 tableCateArry.insertObject(tCateDictionary, atIndex: tmpRow) 往数据源里 insert 数据之后,确实调用了 reloadRowsAtIndexPaths,根据上面的分析,这里应该是使用 insertRowsAtIndexPaths。另外,你的刷新操作是在 for 循环里面做的,可以把它拿到外面来统一进行,使用 for 循环构建需要插入的 indexPaths 数组,然后在 for 循环完成后,统一调用一次 insertRowsAtIndexPaths 即可。

第二个问题:NSDictionary, NSArray 等 NS 开头的类型都是旧 objective c 里的类型,它们对于泛型支持的较弱,所有的东西读出来都是 AnyObject?,所以会遇到很多转型的问题。推荐你用 swift 里的 Array,Dictionary 替代,它们对泛型有很好的支持,里面存的东西的类型都是已知的,不用各种转换,举个例子:

// 这里也不一定要是 class,struct 也可以(或许 struct 更合适)
 class Cate {
      public var level: Int?
      public var catno: String?
      public var catName: String?
      public var open: Bool?
  }

var tableCateArray = Array<Cate>()
var cate = Cate()
// 初始化 cate
// cate.level = 1
// ...
tabeCateArray.append(cate)

如果你最初拿到的是 json 格式的数据,那你可能会遇到把 json 转换成具体的对象的问题,这个你可以看一下 ObjectMapper

以上这样,在具体的使用的地方,就会是很清晰的类型,避免了各种转换(或者至少把转换的逻辑模块化了,不会到处都是转换的代码)。

这篇关于swfit - 有关 新增cells into tableview 动画问题,及Anyobjce转型问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆