-4

searchBar には、次のコードがあります

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    [searchBar rejectFirstResponder];
    self.filteredResults = [[NSMutableArray alloc] init];
    NSPredicate* predicate = [NSPredicate predicateWithFormat:@"(%K == %@)", field1, field2];
    self.filteredResults = (NSMutableArray *)[originalArrayfilteredArrayUsingPredicate:predicate];
}

編集:

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
{
    originalArray = [[NSArray alloc] initWithContentsOfFile:path];
    はいを返します。
}

述語を 2 回目に実行するとself.fiteredResultssearchBarSearchButtonClicked:searchBarメッセージ内の割り当てでプログラムがクラッシュします。含める[self.filteredResults removeAllObjects]と、そこでプログラムがクラッシュするため、削除されましたが、2回目の検索では機能しません。このコードの中にクラッシュの原因となるものはありますか、それとも他の場所を探す必要がありますか? 前もって感謝します。

4

3 に答える 3

1

この行:

originalArray = [[NSFileManager defaultManager] fileExistsAtPath:path];

BOOLaを配列属性に設定しようとしているためです。


配列の変更可能なコピーを作成する必要があります。

self.filteredResults = [[originalArray filteredArrayUsingPredicate:predicate] mutableCopy];
于 2013-07-29T20:04:24.870 に答える
0

元の配列は正しく割り当てられていましたが、

動作するための完全なコード:

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    [searchBar rejectFirstResponder];

    NSString* documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString* path = [documentsDirectory stringByAppendingPathComponent:@"plist.plist"];

    if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {
        self.arrayFromCloud = [[NSArray alloc] initWithContentsOfFile:path];
    }

    eventFromCloud = [[NSMutableArray alloc] init];

    for (NSDictionary* dic in self.arrayFromCloud) {
        [eventFromCloud addObject:[dic valueForKey:@"イベント"]];
    }

    [eventFromCloud removeObjectAtIndex:0];

    self.filteredResults = [[NSMutableArray alloc] init];

    searchBar.placeholder = @"検索";

    // NSPredicate を使用して配列をフィルタリングします
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(%K == %@)", @"会場名", @"スターバックス"];
    self.filteredResults = [[eventFromCloudfilteredArrayUsingPredicate:predicate] mutableCopy];

    searchBar.text = nil;
    self.arrayFromCloud = nil;
    eventFromCloud = なし;
    self.filteredResults = nil;

}

このコードを機能させる唯一の方法は、検索で 2 回目に使用する中間配列と結果配列を割り当て/初期化することでした。もともと、それがバグの原因である可能性があるとは考えもしませんでした。

于 2013-07-29T20:54:20.680 に答える
-1

述語の書き方に問題があります。配列内のオブジェクトに「field1」プロパティが含まれていません。

于 2013-07-29T20:32:56.857 に答える