使用 UILocalizedIndexedCollat​​ion sectionForObject:collat​​ionStringSelector 的动态选择器

Posted

技术标签:

【中文标题】使用 UILocalizedIndexedCollat​​ion sectionForObject:collat​​ionStringSelector 的动态选择器【英文标题】:Dynamic selector using UILocalizedIndexedCollation sectionForObject:collationStringSelector 【发布时间】:2015-08-02 16:16:27 【问题描述】:

我需要在使用 UILocalizedIndexedCollat​​ion 时动态设置选择器 在我的应用程序中,我有以下代码:

 UILocalizedIndexedCollation *indexedCollation=[UILocalizedIndexedCollation currentCollation];
    for (MyObject *theObject in objects)
    
        NSInteger section;
        section=[indexedCollation sectionForObject:theObject collationStringSelector:@selector(mainTitle)];

        theObject.section=(int)section;
    

mainTitle 是 myObject 中的众多属性之一。 但是,我希望选择器可以使用任何字符串。我遵循了这个网站的提示: What is the role of selector in UILocalizedIndexedCollation's sectionForObject:(id)object collationStringSelector:(SEL)selector method,并介绍了以下内容:

-(NSString*)myString

    NSString* myString;
    myString = // whatever code to set new string belonging to myObject
    return myString;


 section=[indexedCollation sectionForObject:theObject collationStringSelector:@selector(myString)];

这导致崩溃并出现错误:[MyObject myString]: unrecognized selector sent to instance ...

添加动态选择器的正确方法是什么?

【问题讨论】:

【参考方案1】:

我假设您正在尝试对 MyObject 的不同属性进行排序。

您报告的错误正在发生,因为MyString 方法需要是MyObject 类的一部分,而不是使用UILocalizedIndexedCollation 的类。

指定选择器的一种动态方式是这样的:

UILocalizedIndexedCollation *indexedCollation = [UILocalizedIndexedCollation currentCollation];

NSString *propertyName;
if (someConditionA) 
    propertyName = @"mainTitle";
 else if (someConditionB) 
    propertyName = @"description"; // whatever property you need
 else 
    propertyName = @"name"; // some default property you want to use

SEL propertySelector = NSSelectorFromString(propertyName);

for (MyObject *theObject in objects) 
    NSInteger section = [indexedCollation sectionForObject:theObject collationStringSelector:propertySelector];
    theObject.section = section;

【讨论】:

我会避免使用 NSSelectorFromString 并且只有一个返回 SEL 的函数,即@selector(mainTitle),这样你就可以从编译器获得一些保护

以上是关于使用 UILocalizedIndexedCollat​​ion sectionForObject:collat​​ionStringSelector 的动态选择器的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)