【发布时间】:2017-12-05 05:33:39
【问题描述】:
我是 Swift 3 编码的新手。 我正在尝试从 iPhone “复制”电话应用程序,但是在单元格中显示数据时遇到了一些问题,它们没有出现(当显然那里有一些数据时,从 Core Data 类中恢复)。 Core Data 类由一个带有一些属性的联系人组成,例如“firstName”、“lastName”、“phoneNumber”等。我在 X.xcdatamodeld 中创建了它。那些属性 设置在另一个 VC 中并保存在那里。 我想在单元格中显示的是按字母顺序按部分排序的每个联系人的名字,例如电话应用程序。 这是我目前所拥有的。
extension Contact {
var titleFirstLetter: String {
return String(firstName![firstName!.startIndex]).uppercased()
}
}
class MainTableViewController: UITableViewController {
var listOfContacts = [Contact]()
var sortedFirstLetters: [String] = []
var sections: [[Contact]] = [[]]
struct Storyboard {
static let cellIdentifier = "Cell"
static let showDetailIdentifier = "showDetail"
static let showInformationIdentifier = "showInformationVC"
}
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
let firstLetters = listOfContacts.map { $0.titleFirstLetter }
let uniqueFirstLetters = Array(Set(firstLetters))
sortedFirstLetters = uniqueFirstLetters.sorted()
sections = sortedFirstLetters.map { firstLetter in
return listOfContacts.filter { $0.titleFirstLetter == firstLetter }.sorted { $0.firstName! < $1.firstName! }
}
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
getData()
tableView.reloadData()
}
func getData() {
// 1. Create context
let context = CoreDataController.persistentContainer.viewContext
// 2. RecoverData from Database with fetchRequest
do {
try listOfContacts = context.fetch(Contact.fetchRequest())
} catch {
print("Error \(error.localizedDescription)")
}
}
// MARK: - Tableview data source
override func numberOfSections(in tableView: UITableView) -> Int {
return sections.count
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return sections[section].count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let contact = sections[indexPath.section][indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: Storyboard.cellIdentifier, for: indexPath)
cell.textLabel?.text = contact.firstName
return cell
}
override func sectionIndexTitles(for tableView: UITableView) -> [String]? {
return sortedFirstLetters
}
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return sortedFirstLetters[section]
}
注意:CoreDataController 是我在管理检索和保存到 CoreData 时使用的一个类(我所做的是从 AppDelegate.swift 复制生成的 CoreData 代码) 希望您能帮助我弄清楚为什么它不起作用。提前致谢!
【问题讨论】:
-
你在使用排序描述符吗?它会解决这个问题
-
@UsamaSadiq 我应该在哪里做呢?用什么方法?很抱歉这个明显的问题,但我是 Swift 的新手
-
获取请求之后
-
@UsamaSadiq 你介意为我这样做吗?我很困惑,如果可能的话,整个方法......谢谢你,Usama。
-
检查答案你应该像这样改变你的getData函数
标签: ios swift uitableview swift3 tableview