Вызов метода rangeOfString вызывает нераспознанную ошибку селектора

Я получаю доступ к контактам адресной книги, а затем запускаю цикл for для всех контактов. Основная цель цикла — получить доступ к значениям имени и номера телефона контактов адресной книги пользователя и поместить эти значения в объекты NSString.

Все вышеперечисленное работает отлично. Моя проблема в том, что мне нужно выполнить определенный код, если данные номера телефона содержат эту строку: _$!<Mobile>!$_

Поэтому я настраиваю вызов метода rangeOfString для объекта, содержащего данные номера телефона, и это вызывает проблемы.

Вот что выводится на консоль после того, как я добавил вызов метода rangeOfString в свой код:

2014-01-18 12:10:49.190 PhotoTest1[1244:60b] -[__NSCFType rangeOfString:]: unrecognized     selector sent to instance 0x14e9ac90
2014-01-18 12:10:49.193 PhotoTest1[1244:60b] *** Terminating app due to uncaught exception     'NSInvalidArgumentException', reason: '-[__NSCFType rangeOfString:]: unrecognized selector    sent to instance 0x14e9ac90'
*** First throw call stack:
(0x2f8f6f4b 0x39d376af 0x2f8fa8e7 0x2f8f91cb 0x2f8fa478 0x55e29 0x3206e37b 0x3206e139     0x32117e27 0x3215449b 0x32152dd3 0x32151e25 0x3232dcb3 0x3209e713 0x3209e6b3 0x3209e691    0x3208a11f 0x3209e107 0x3209ddd9 0x32098e65 0x3206e79d 0x3206cfa3 0x2f8c2183 0x2f8c1653 0x2f8bfe47 0x2f82ac27 0x2f82aa0b 0x34551283 0x320ce049 0x54495 0x3a23fab7)
libc++abi.dylib: terminating with uncaught exception of type NSException

А вот и весь мой код, начиная с цикла for. Ошибка выводится на консоль, как только доходит до "if([phoneNumber rangeOfString:@"+"].location == NSNotFound)":

for (i = 0; i < [allContacts count]; i++)
    {


        Person *person = [[Person alloc] init];

        ABRecordRef contactPerson = (__bridge ABRecordRef)allContacts[i];
        NSString *firstName = (__bridge_transfer NSString
                                *)ABRecordCopyValue(contactPerson, kABPersonFirstNameProperty);
        NSString *phoneNumber = (__bridge_transfer NSString *)ABRecordCopyValue(contactPerson, kABPersonPhoneProperty);


        person.firstName = firstName;

        person.phoneNumber = phoneNumber;

        NSLog(@"%@", phoneNumber);

        //MOBILE PHONE PSEUDOCODE STARTS HERE

        // If the value of phoneNumber contains the text “_$!<Mobile>!$_” , then we want to grab a substring out of it.

        if([phoneNumber rangeOfString:@"_$!<Mobile>!$_"].location == NSNotFound) {

            NSLog(@"Not a mobile phone number");

        } else {

            NSLog(@"It is a mobile phone number");

            // If the value of phoneNumber contains a “+”, then grab the substring that starts with the + and then the next additional 10 spaces and place the substring in the mobilePhoneNumber object. (Which will grab the + sign and the 10 digit phone number. )

            if([phoneNumber rangeOfString:@"+"].location == NSNotFound) {


                NSLog(@"Phone number does not start with a +");


            } else {

                NSLog(@"Phone number does start with a +");

                NSString *subString = [phoneNumber substringWithRange: NSMakeRange(0, [phoneNumber rangeOfString: @"+"].location)];

                NSLog(@"%@", subString);

            }

        }

        //PFQUERY CODE TESTING!!!

}   
}

}

Спасибо за помощь.


person user3117509    schedule 18.01.2014    source источник


Ответы (1)


Номер телефона не является строкой. он определяется как многозначный, так как там могут быть числа 0..x.

вы не можете просто рассматривать его как строку. вам нужно перечислить через multival\

например чтобы получить первый в ЛЮБОМ виде

    ABMultiValueRef phoneEntries = ABRecordCopyValue(person, kABPersonPhoneProperty);       
    NSMutableArray *numbers = [NSMutableArray array)];
    for(int i = 0; i < ABMultiValueGetCount(phoneEntries); i++) {
         NSString *number = (__bridge_transfer NSString*)ABMultiValueCopyValueAtIndex(phoneEntries, i))];
         // Do what you want with the number
         [numbers addObject:number];
    }
    CFRelease(phoneEntries);
person Daij-Djan    schedule 18.01.2014
comment
Попался, это имеет смысл. Моя главная цель — извлечь данные номера мобильного телефона и избавиться от всего остального хлама, который хранится. Могу ли я сделать это, перечислив многозначность, как вы сказали, и если да, то можете ли вы дать мне пример кода или указать мне на какую-либо документацию? - person user3117509; 19.01.2014
comment
Итак, если я правильно это понимаю... используя ваш код выше, я смогу сделать именно то, что я пытался сделать раньше, И сделать это с помощью rangeOfString, ПОТОМУ ЧТО теперь вы используете ABMultiValueGetCount и ABMultiValueCopyValueAtIndex вместо использования count и ABRecordCopyValue ? - person user3117509; 19.01.2014
comment
Я до сих пор не понимаю, ПОЧЕМУ мы не можем использовать rangeOfString с моим исходным кодом, когда я создавал экземпляр объекта NSString и мог помещать туда данные. Если я могу поместить данные в NSString в первую очередь, то почему я не могу использовать rangeOfString? В чем разница между этой ситуацией и всеми другими случаями, когда я использовал rangeOfString для объекта NSString? - person user3117509; 19.01.2014
comment
Я думаю, что это строка из-за этого утверждения: NSString *phoneNumber = (__bridge_transfer NSString *)ABRecordCopyValue(contactPerson, kABPersonPhoneProperty); - person user3117509; 19.01.2014
comment
только потому, что вы говорите, что это должно быть. думайте о типе указателя просто как о метке. - person Daij-Djan; 19.01.2014
comment
@user3117509 user3117509 нет, извините, это был ABMultiValueRef все это время - person Daij-Djan; 19.01.2014
comment
См. выше, разве мы не помещаем данные внутрь объекта NSString с именем phonenumber? И если да, то мы должны иметь возможность использовать rangeOfString правильно? Я не пытаюсь с вами спорить, просто пытаюсь понять теорию, стоящую за всем этим. - person user3117509; 19.01.2014
comment
давайте продолжим это обсуждение в чате - person Daij-Djan; 19.01.2014
comment
Objective-c — это первый язык программирования, который я когда-либо изучал, я начал изучать его около 45 дней назад и потратил 145 часов на изучение и кодирование. У меня все хорошо, судя по тому, как долго я учусь? Был бы признателен за ваш вклад, поскольку у вас такой высокий ранг SO. - person user3117509; 19.01.2014
comment
Я действительно не знаю, НО я могу сказать, что отсутствие указателей - это проблема, с которой борются все студенты здесь. Это фундаментально (IMO) - не забывайте, что objC - это просто прокачанный C - person Daij-Djan; 19.01.2014
comment
Спасибо. Я постараюсь освежить свою теорию указателей. Кроме того, это может быть потому, что я впервые работаю с Core Foundation, поэтому я тоже освежу в памяти этот вопрос. Спасибо, я ценю, что вы нашли дополнительное время, чтобы помочь ура. - person user3117509; 19.01.2014