【发布时间】: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