【问题标题】:how do I make my sort function working to actually display the sorted books in the tableview如何使我的排序功能能够在表格视图中实际显示已排序的书籍
【发布时间】:2021-07-27 18:22:08
【问题描述】:

您好,尝试使用 CocoaPods 下拉菜单创建排序按钮,代码未显示任何错误且菜单有效,但如果我单击该按钮,则没有任何反应。

    dropDown.selectionAction = { [weak self] (index: Int, item: String) in //8
      guard let _ = self else { return }
      sender.setTitle(item, for: .normal) //9
       
        let realm = try! Realm()
        var books = realm.objects(Book.self).sorted(byKeyPath: "title", ascending: false)
    
        if item == "sort by author" {
            func filterResultsbyauthor(searchString: String){
                 let predicate = NSPredicate(format: "author BEGINSWITH [c]%@", searchString)
                books = realm.objects(Book.self).filter(predicate).sorted(byKeyPath:"author", ascending: true)
                self?.tableview.reloadData()
            }
        }
    }

【问题讨论】:

  • 代码有点难以理解。你为什么要读两遍书? 'books' 是您的 tableView 数据源吗?如果是这样,它不会显示任何内容,因为书籍是本地变量var books = realm.objects - 这是故意的吗?另外,为什么要在 if 语句 func filterResultsbyauthor( 中定义另一个函数,因为它没有被调用。
  • 我删除了局部变量并按照建议将函数更改为一段代码,但仍然无法正常工作。我收到错误“由于未捕获的异常'无效值'而终止应用程序,原因:'预期'Book'类型对象上的属性'author'类型的字符串类型对象,但收到:(null)'

标签: swift realm dropdown


【解决方案1】:

错误可能在这里:

func filterResultsbyauthor(searchString: String){
    let predicate = NSPredicate(format: "author BEGINSWITH [c]%@", searchString)
    books = realm.objects(Book.self).filter(predicate).sorted(byKeyPath:"author", ascending: true)
    self?.tableview.reloadData()
}

您定义了一个函数,但从未调用它。

您可以:

  1. 调用函数
func filterResultsbyauthor(searchString: String){
    let predicate = NSPredicate(format: "author BEGINSWITH [c]%@", searchString)
    books = realm.objects(Book.self).filter(predicate).sorted(byKeyPath:"author", ascending: true)
    self?.tableview.reloadData()
}

filterResultsbyauthor(searchString: "Your search string") /// here!
  1. 删除函数声明,只写一段代码
let predicate = NSPredicate(format: "author BEGINSWITH [c]%@", "Your search string")
books = realm.objects(Book.self).filter(predicate).sorted(byKeyPath:"author", ascending: true)
self?.tableview.reloadData()

【讨论】:

  • 还需要从主队列调用 Sender.setTitle。你可以安全地删除 self 的保护声明,它实际上并没有做任何事情。如果 self 在调用 self 之前被释放?可选链将停止崩溃。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-03
  • 2022-01-27
  • 1970-01-01
相关资源
最近更新 更多