1

iPhone アプリをデバッグしていて、面白いことがわかりました。

TabBarcontroller(6 つのタブ) を持つ UIViewControllers があります。各タブは UIViewController であり、UITtableview があります。viewDidLoad が機能し、初期データをもたらします。UITableView には検索バーがあります。ユーザーが検索を押した後、いくつかの魔法が起こり、データを含む配列を取得します。テーブルビューに新しいデータが表示されず、[tableView reloadData] は viewDidLoad の外では効果がありません (初めて)。

データを保持する配列と、dataSource が self に設定されていることがわかります。それでも、データは表示されません!

だから私は試してみました [self.tableView reloadData] & [self.tableView setNeedsDisplay]

おかしなことに、新しいデータは表示されていません。ただし、テーブルを上下に移動すると、cellForRowAtIndexPath が発生し、最初の行にデータが表示されます。

誰かこの謎に光を当てることができますか???

[self.view refreshscreen] がある場合 ??

-(void) viewWillAppear:(BOOL)animated{
    [self.tableView reloadData];
    [super viewWillAppear:animated];    
}

- (void) searchBarSearchButtonClicked:(UISearchBar *)searchBar2 {   
    [self searchForFullNames];
        //NSAssert(tableView, @"Whoops, tableView is Null");
    [tableView reloadData];
        // hide keyboard
    [searchBar2 resignFirstResponder];
}
- (void)viewDidLoad {

    NSString *path = [[NSBundle mainBundle] pathForResource:@"search" ofType:@"plist"];
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithContentsOfFile:path];  
    self.names = dict;
    [dict release];
    NSArray *array = [[names allKeys] sortedArrayUsingSelector:@selector(compare:)];
    self.keys = array;
    isSearchOn = NO;
    canSelectRow = NO;

    self.tableView.scrollEnabled = NO;

    [super viewDidLoad];
}



- (void) searchForFullNames {

    self.listData = nil;
    self.names = nil;
    self.keys = nil;

    NSMutableDictionary *dict = [[NSMutableDictionary alloc]  init];
    NSMutableArray *person = [[NSMutableArray alloc] init];

    [person addObject:@"Doe, John"];
    [person addObject:@"11234"];    
    [person addObject:@"11/22/75"]; 

    [dict setObject:person forKey:@"Person 1"];

    person = [[NSMutableArray alloc] init];

    [person addObject:@"Doe, Mary"];
    [person addObject:@"4321"]; 
    [person addObject:@"11/22/85"]; 

    [dict setObject:person forKey:@"Person 2"];

    person = [[NSMutableArray alloc] init];

    [person addObject:@"Doe, John"];
    [person addObject:@"336655"];   
    [person addObject:@"10/22/84"]; 

    [dict setObject:person forKey:@"Person 3"];

    self.names = dict;

    [dict release];
        NSArray *array = [[names allKeys] sortedArrayUsingSelector:@selector(compare:)];
    self.keys = array;

    isSearchOn = NO;
    canSelectRow = YES;

}
4

4 に答える 4

7

UISearchDisplayController には、searchResultsTableView という独自の tableView プロパティがあります。searchDisplayController を使用している場合は、次を使用してみてください。

[searchDisplayController.searchResultsTableView reloadData];
于 2010-03-31T22:38:40.583 に答える
1
[self.searchDisplayController.searchResultsTableView reloadData];
于 2015-01-14T06:46:24.557 に答える
1

あなたが説明している動作(スクロールするまで新しいデータが表示されない)は、テーブルビューで reloadData を呼び出さなかった場合に起こると予想されるものとまったく同じです。いくつかのブレークポイントを設定し、右側の UITableView で reloadData が実際に呼び出されていること、および reloadData の結果として cellForRowAtIndexPath が呼び出されていることを確認します。

1 つの推測は、self.tableView IBOutlet が配線されておらず、self.tableView が NULL であることです。tableview Delegate と Datasource が接続されている可能性がありますが、tableView 自体は接続されていません。

于 2010-03-31T19:53:35.407 に答える
0

viewDidLoadは、ViewControllerがロードされたときに1回だけ呼び出されます。ビューが表示されるたびに(たとえば、タブを切り替えるときに)テーブルを更新する場合は、代わりに、reloadData呼び出しをviewWillAppearに配置します。

于 2010-04-01T00:29:19.863 に答える