在 Swift 中对 TableView 的 plist 数组进行排序

Posted

技术标签:

【中文标题】在 Swift 中对 TableView 的 plist 数组进行排序【英文标题】:Sorting a plist array for TableView in Swift 【发布时间】:2016-05-21 12:04:09 【问题描述】:

我在 Swift 中执行 Objective C 中非常容易的事情时遇到了一些麻烦。也就是说,在填充单元格之前,在“标题”字段上按字母顺序对 plist 进行排序。

整个“排序”过程看起来在 Swift 中应该更容易,但我就是不明白。我已经拖网了,但没有得到解决方案。非常感谢任何帮助。 (我没有把所有的代码都放在这里,因为它是多余的)。

override func viewDidLoad() 
        super.viewDidLoad()
        let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString
        let sourcePath = documentsPath.stringByAppendingPathComponent("MyAnnotationsUSA.plist")

        if let myMuseums = NSArray(contentsOfFile: sourcePath as String)
                for item in myMuseums 
                    titleData.append(item.objectForKey("title") as! String)
                    subTitleData.append(item.objectForKey("subtitle") as! String)
                    stateData.append(item.objectForKey("state") as! String)

etc.etc......

【问题讨论】:

感谢 PravinS。在我回到它之前你做了代码编辑:-) 您想如何排序?我的意思是根据您要排序的参数? 我想对键码“title”上的数组进行排序。这就是我在 Objective C 中所做的,我想在 Swift 中做同样的事情://按标题字母顺序排序 NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES];_sortedTitle = [_content sortedArrayUsingDescriptors: @[描述符]]; 返回_sortedTitle; 【参考方案1】:

您似乎过早地取消了数据的关联。这个怎么样:

var data: [(String, String, String)] = []
if let myMuseums = NSArray(contentsOfFile: sourcePath as String)
    for item in myMuseums 
        data.append((item.objectForKey("title") as! String, item.objectForKey("subtitle") as! String, item.objectForKey("state") as! String))
    

data.sortInPlace($0.0 < $1.0)
titleData = data.map($0.0)
subTitle = data.map($0.1)
stateData = data.map($0.2)

...看看那些被强制解开的东西...!

【讨论】:

谢谢,但不是我想要的。在 Obj C 中,我只是用一个键对整个数组进行排序,即标题。 -(NSArray *)content if (!_content) content = [[NSArray alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"MyAnnotationsUSA" ofType:@"plist"]]; NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES]; _sortedTitle = [_content sortedArrayUsingDescriptors:@[descriptor]]; return _sortedTitle; if let path = NSBundle.mainBundle().pathForResource("MyAnnotationsUSA", ofType: "plist"), content = NSArray(contentsOfFile: path) let descriptor = NSSortDescriptor(key: "title", ascending: true) let sortedTitle = content.sortedArrayUsingDescriptors([descriptor]) 有什么问题 非常感谢 Grimxn。刚出去吃午饭,很高兴回来解决问题,谢谢您的帮助。我正在下载 pList,所以没有从 mainBundle 访问它。所以我做了一些摆弄,让它工作了。再次谢谢你。我会为其他人发布代码【参考方案2】:

在 SO 上有一些很大的帮助并解决了这个问题。我正在从服务器下载 pList,因此它没有保存在 mainBundle 中。这是解决方案(请原谅我用来分隔不同元素的空白):

    let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString
    let sourcePath = documentsPath.stringByAppendingPathComponent("MyAnnotationsUSA.plist")

    if let content = NSArray(contentsOfFile: sourcePath as String)


    let descriptor = NSSortDescriptor(key: "title", ascending: true)
    let myMuseum = content.sortedArrayUsingDescriptors([descriptor])

        for item in myMuseum
                titleData.append(item.objectForKey("title") as! String)
                subTitleData.append(item.objectForKey("subtitle") as! String)

【讨论】:

以上是关于在 Swift 中对 TableView 的 plist 数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

为了在 PL/SQL 中对这些数据进行排序,使用啥数据结构?

在手动创建的部分中对核心数据 tableView 行进行分组

在 Oracle PL/SQL 中对 ref_cursor 的 DISTINCT 计数

在 Swift4 中取消选中 TableView 所有 TableView 选择

如何在 swift 中在动态 TableView 中创建动态 tableView?

Swift初窥--使用Swift实现TableView