0

私のアプリケーションでは、ARC を有効にし、それを初めて使用します。経験の浅い ARC 対応コードの処理が原因でトラブルが発生しました。

dataタイプの名前付きの強力なプロパティと、同じタイプの NSMutableArray弱いインスタンス変数があります_currentData

を使用し_currentDataて、アプリケーションに tableView をロードします。表示したい主なコレクションは常にdata可変です。data変数ごとに変数が指す MutableArray を指し_currentData、以下は私の ViewDidLoad です

-(void)ViewDidLoad
{
    data=[[NSMutableArray alloc]init];

    //load the data 

    _currentData=data; 
    [myTableView reloadData];

}

私のdataSourceメソッドは以下のようなものです

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
     return [_currentData count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     id var=[_currentData objectAtInsex:indexPath.row];
     //.....my drawing methods on the cell View 
     return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    id var=[_currentData objectAtInsex:indexPath.row];
    NSlog(@"var %@",var);
}

上記のコードは正常に機能しており、セルをタップするたびに、以下のコードのように検索バーを実装する予定になるまで var が出力されます

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{

    _currentData =[data filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:[NSString stringWithFormat:@"name contains[c] '%@'",searchText]]];//  Object with attribute name
    [myTableView reloadData];
}

上記のコードは、フィルタリングされた結果をtableViewに表示するまでは正常に機能していますが、行のいずれかをタップするとnullが出力されました

どこが間違っていたのかわかりません。

4

2 に答える 2

1
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText  {   
    _currentData =[data filterUsingPredicate:myPredicateVariable];
    [myTableView reloadData];
}

ここに障害ロジックがあります。可変配列を変更するときに、配列を (インプレースで) フィルター処理します。あなたが望むのは、新しいフィルタリングされた配列を取得することです。それ以外の場合、これは一度だけ/めったに機能しません

それで

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText  {   
    NSMutableArray *newData = [data filteredArrayUsingPredicate:myPredicateVariable];
    _currentData = newData;
    [myTableView reloadData];
}

THEN _currentDataは、他の誰も新しい配列を保持していないため、最も強力です。__weak の場合、newData がリリースされるとすぐに nil になります。

于 2013-03-30T13:23:32.633 に答える