【问题标题】:Search results not showing right data in DetailViewController (Swift 3)搜索结果未在 DetailViewController (Swift 3) 中显示正确的数据
【发布时间】:2016-10-31 23:58:30
【问题描述】:

我有 3 个对象通过 Swift 中的默认 Segue 函数发送到 DetailViewController(标题、日期、正文)。我只是在搜索标题数据。这部分工作得很好,但是当点击 SearchController 中的单元格时,它把我带到了错误的视图。 (标题在视图中,但日期和正文不匹配)。

转场功能:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showDetail" {
        if let indexPath = self.tableView.indexPathForSelectedRow {

            var object = tableTitle[indexPath.row] as String
            var objectTwo = detailDate[indexPath.row] as String
            var objectThree = tableBody[indexPath.row] as String

            let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController

            if resultSearchController.isActive {

                object = filteredTableData[indexPath.row]

            } else {

                object = tableTitle[indexPath.row]
                objectTwo = detailDate[indexPath.row]
                objectThree = tableBody[indexPath.row]

            }

            controller.detailItem = object
            controller.detailItemTwo = objectTwo
            controller.detailItemThree = objectThree
            controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem
            controller.navigationItem.leftItemsSupplementBackButton = true
        }
    }
}

cellForRowAt 函数:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! CustomTableViewCell

    let imageView = UIImage(named: "dIndicator")
    cell.accessoryView = UIImageView(image: imageView)

    let object = tableTitle[indexPath.row]
    let objectTwo = tableBody[indexPath.row]
    let objectThree = tableDate[indexPath.row]

    if self.resultSearchController.isActive {
        cell.titleLabel!.text = filteredTableData[indexPath.row]
        cell.detailLabel!.text = ""
        cell.dateLabel!.text = ""

    } else {
        cell.titleLabel!.text = object
        cell.detailLabel!.text = objectTwo
        cell.dateLabel!.text = objectThree
    }

    return cell
}

更新搜索结果函数:

func updateSearchResults(for searchController: UISearchController) {

    filteredTableData.removeAll(keepingCapacity: false)
    let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
    let array = (tableTitle as NSArray).filtered(using: searchPredicate)
    filteredTableData = array as! [String]
    self.tableView.reloadData()

}

任何帮助将不胜感激!

编辑:

struct objectsToPass {

var annTitle = [String]()
var annBody = [String]()
var annDate = [Date]()
var annDateALT = [Date]()

var tableData : [([String], [String], [Date], [Date])] {
    get {
        return [(annTitle, annBody, annDate, annDateALT)]
    }
}

}

【问题讨论】:

  • 看看你是如何在prepareForSegue中创建对象的...如果搜索控制器是活动的,object = filtersTableData[indexPath.row],但是objectTwo和objectThree是一样的,不管它是不是活跃。
  • @user3353890 我该如何解决这个问题?当 searchBar 处于活动状态时,我不知道应该将 objectTwo 和 objectThree 分配给什么
  • 我会创建一个包含三个变量的对象的结构或类定义:标题、日期和正文。然后我会有两个数组,一个用来存储tableData,一个用来存储filteredTableData。每个数组都将包含您创建的结构或类类型的对象。如果搜索控制器处于活动状态,则显示来自 filtersTableData 数组的对象,如果不是,则显示来自 tableData 数组的对象。然后当你移动到细节控制器时,你可以通过调用object.title、object.date和object.body来访问你需要的信息。
  • @user3353890 好吧,我是这样开始的,我至少是朝着正确的方向前进吗? (更新帖子)
  • 为什么有这么多数组?我在下面发布了一个答案,希望对您有所帮助。

标签: ios swift uitableview master-detail


【解决方案1】:

试试这个:

struct myObject {

    var title: String
    var body: String
    var date: Date
    var altDate: Date
}

然后为您的表格数据和过滤的表格数据设置两个数组

var tableData = [myObject]()
var filteredData = [myObject]()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 2014-06-23
    • 2017-02-19
    • 1970-01-01
    • 2015-10-30
    • 2023-04-07
    相关资源
    最近更新 更多