【发布时间】:2016-03-25 11:18:48
【问题描述】:
在更新之前,我这段代码运行良好:
var alphabetizedArray = [[Person]]()
let collation = UILocalizedIndexedCollation()
for person : Person in ContactsManager.sharedManager.contactList {
var index = 0
if ContactsManager.sharedManager.sortOrder == .FamilyName {
index = collation.sectionForObject(person, collationStringSelector: "lastName")
}
else {
index = collation.sectionForObject(person, collationStringSelector: "firstName")
}
alphabetizedArray.addObject(person, toSubarrayAtIndex: index)
}
但是现在由于不再允许使用字符串文字选择器,因此代码损坏了。
我尝试将字符串文字选择器更改为 Selector("lastName"),但“索引”始终返回为 -1。而且我没有看到任何解决方案。
此排序方法采用给定对象的属性名称。而 Person 类确实具有这些属性(姓氏、名字)。
但是我怎样才能再次获得这项工作呢? #selector 的实验没有给我任何帮助:“'#selector' 的参数不指代初始化程序或方法”它说。难怪这 sectionForObject(, collationStringSelector:) 不采用任何方法,只采用一个属性名称。
【问题讨论】:
-
matt 的也不错:stackoverflow.com/a/35658335/2227743
-
我已经看到了,但我看不出它对我的情况有何帮助。在我的情况下,我不需要方法作为选择器,而是某种排序的属性名称。而且无论我用什么语法编写这个选择器,它都不起作用,因为新语法需要现有的方法名称而不是字符串文字。
-
但是sectionForObject 采用一个选择器,该选择器“标识返回用于排序规则的对象的标识字符串的方法”,因此使用 Module.Class.method 应该可以工作(也许在你的类中你必须有一个返回属性的方法,而不是仅仅尝试使用新语法的属性?不确定。)
-
我在我的 Person 类 class func lastNameString() -> String { return "lastName" } 中编写了一个测试函数,然后我将选择器更改为这个 #selector(Person.lastNameString)。但是现在我因为发送到实例的错误无法识别的选择器而崩溃。这是一个谜。
-
您是否尝试过 Module.Class.method 而不仅仅是 Class.method?只是一个猜测。确实有些玄机。如果您实际上找不到此特定问题的解决方案,我将重新打开它。
标签: ios swift cocoa uilocalizedcollation