gpt4 book ai didi

ios - 使用 UILocalizedIndexedCollat​​ion 在 Swift 4.2 中创建 tableView 部分索引时出现错误 "unrecognized selector sent to instance"

转载 作者:行者123 更新时间:2023-11-28 07:32:21 24 4
gpt4 key购买 nike

我正在尝试构建一个仿照 iPhone 的通讯录应用程序的应用程序。在那个过程中,我试图将部分索引放在我的联系人 tableView 的右侧。 Apple 的 iOS 文档 TableView 编程指南建议使用 UILocalizedIndexedCollat​​ion 类。问题似乎出在 collat​​ionStringSelector 上。在 Swift 4 中,选择器需要暴露给@objc,无论如何我都找不到这样做,我尝试过的一切都返回了这个错误消息:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSTaggedPointerString localizedTitle]: unrecognized selector sent to instance

我试图将选择器对象放入它自己的类中,以便我可以将它公开给@objc,但这没有用。这是我试过的代码:

class SelectorObj: NSObject {

@objc var selector: Selector

init(selector: Selector) {
self.selector = selector
}
}

回到基线代码。这是我正在努力工作的示例代码。

class ObjectTableViewController: UITableViewController {

let collation = UILocalizedIndexedCollation.current()
var sections: [[AnyObject]] = []
var objects: [AnyObject] = [] {
didSet {
let selector: Selector = #selector(getter: UIApplicationShortcutItem.localizedTitle)
sections = Array(repeating: [], count: collation.sectionTitles.count)

let sortedObjects = collation.sortedArray(from: objects, collationStringSelector: selector)
for object in sortedObjects {
let sectionNumber = collation.section(for: object, collationStringSelector: selector)
sections[sectionNumber].append(object as AnyObject)
}

self.tableView.reloadData()
}
}

override func viewDidLoad() {
super.viewDidLoad()
objects = (["One", "Two", "Three"] as [AnyObject])
}

// MARK: UITableViewDelegate

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 cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
let cellData = sections[indexPath.section][indexPath.row]
cell.textLabel!.text = (cellData as! String)
return cell
}

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return collation.sectionTitles[section]
}

override func sectionIndexTitles(for tableView: UITableView) -> [String]? {
return collation.sectionIndexTitles
}

override func tableView(_ tableView: UITableView, sectionForSectionIndexTitle title: String, at index: Int) -> Int {
return collation.section(forSectionIndexTitle: index)
}
}

预期的结果是获取 tableView 联系人列表右侧的部分索引(A...Z,#),就像在 iPhone 的联系人应用程序中一样。

最佳答案

您传递给 sortedArray(from:collat​​ionStringSelector:) 的选择器需要是在正在排序的对象类型上找到的选择器。您的数组中的对象没有 localizedTitle 属性。

通常,您会有一组要排序的类或结构,您会传递类或结构的某些属性的选择器。

但是你的数组是String的数组。因此,您需要 String 的一个属性,该属性返回用于排序的字符串。

并且由于这种选择器的使用是基于旧的 Objective-C 框架,因此该属性需要暴露给 Objective-C。

String 数组起作用的一件事是使用选择器 NSString.description。这是可行的,因为 Swift String 可以桥接到 NSString

您需要做的另一件事是将数组类型从 AnyObject 更改为它的实际类型 - String

var sections: [[String]] = []
var objects: [String] = [] {
didSet {
let selector: Selector = #selector(NSString.description)
sections = Array(repeating: [], count: collation.sectionTitles.count)

let sortedObjects = collation.sortedArray(from: objects, collationStringSelector: selector)
for object in sortedObjects {
let sectionNumber = collation.section(for: object, collationStringSelector: selector)
sections[sectionNumber].append(object)
}

self.tableView.reloadData()
}
}

override func viewDidLoad() {
super.viewDidLoad()
objects = ["One", "Two", "Three"]
}

更新尝试将这些值转换为字符串的其他代码,因为不再需要它了。

关于ios - 使用 UILocalizedIndexedCollat​​ion 在 Swift 4.2 中创建 tableView 部分索引时出现错误 "unrecognized selector sent to instance",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54359108/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com