0

アドレス帳クラスがあり、このクラスにはsearchNameメソッドがあります。アドレス帳から名前を削除するメソッドを追加したいと思いremoveNameます (書いている間、それはかなり明確だと思いました..共有するだけです)。

とにかく、私が使用することですがpreformSelector:@selector(searchNames)、この行でエラーが発生します..これは私のコードです:

//method to search address cards
-(NSMutableArray *) searchName:(NSString *) someName{

    NSMutableArray *namsFound = [[NSMutableArray alloc] init];

    for (AddressCards *addressCard in book){

        if ([addressCard.name rangeOfString:someName options:NSCaseInsensitiveSearch].location != NSNotFound)
            [namsFound addObject:addressCard];
        else if ([addressCard.email rangeOfString:someName options:NSCaseInsensitiveSearch].location != NSNotFound)
            [namsFound addObject:addressCard];
        else if ([addressCard.country rangeOfString:someName options:NSCaseInsensitiveSearch].location != NSNotFound)
            [namsFound addObject:addressCard];
        else if ([addressCard.workPlace rangeOfString:someName options:NSCaseInsensitiveSearch].location != NSNotFound)
            [namsFound addObject:addressCard];
    }

    return [namsFound count]? namsFound : nil;
}

を返すこのメソッド宣言を使用する必要がありますBOOL

-(BOOL) removeName:(NSString *)theName{

    if ([theName performSelector:@selector(searchName:)] > 0){
        for (AddressCards *card in book)
            [book removeObject:theName];
        return YES;
    }

        else
            return NO;
}

これは、main.mでテストしようとしている方法です:

AdressBook *myBook = [[AdressBook alloc] initWithName:@"Family Address Book"];

if([myBook removeName:@"nir"] == YES)
            [myBook list];
        else
            NSLog(@"Not in address book");

この行でスレッド 1 SIGBRT を取得しています: for (AddressCards *card in book)

これを理解するのを手伝ってください。乾杯

4

4 に答える 4

2

文字列オブジェクトが応答する必要があるのはなぜ-searchName:ですか? 文字列を引数として、自分自身で呼び出します。ここには理由がないようです-performSelector:。また、純粋な存在だけでなく、配列の数も確認したいと考えています。

-(BOOL) removeName:(NSString *)theName{

    if ([self searchName:theName]){
        for (AddressCards *card in book)
            [book removeObject:theName];
        return YES;
    }
    return NO;
}

OK、検索名をもう一度見てみました。配列が空の場合は nil を返します。だからあなたは電話する必要はありません-count


試す

-(BOOL) removeName:(NSString *)theName{
    NSArray *results = [self searchName:theName];
    if (results){
       [book removeObjectsInArray: results];
       return YES;
    }
    return NO;
}
于 2013-03-05T12:17:15.213 に答える
0

あなたはという名前のメソッドを持っていますsearchName

クラスsearchNameメソッドがあります。

しかし、あなたはここで呼んsearchNamesでいます、それをに変更してくださいsearchName:

preformSelector:@selector(searchNames:)//one : as it takes one argument
于 2013-03-05T12:10:00.283 に答える
0

これは、performSelectorに戻り値がないためです。なぜ通常どおりメソッドを呼び出せないのですか?

if ([self searchName:theName]) // do stuff

paramをsearchCards:にも渡していないことに注意してください。また、その値を以前のように0と比較しないでください(何も見つからなかった場合、メソッドはnilを返します)。

編集:

Nameではなくselfでメソッドを呼び出す必要があります。

于 2013-03-05T12:10:30.880 に答える
0

そのメソッドには1つのパラメーターがあるため、 preformSelector:@selector(searchNames:) を使用する必要があります

オブジェクト以外のその関数からの戻り値が必要な場合は、 NSInvocation を使用できます

于 2013-03-05T12:17:55.747 に答える