2010-01-08 5 views
0

화면에 ScopeBar가 포함 된 TabBar, NavBar, SearchBar가 있습니다. 원격 서버를 통해 데이터를 검색하고 내용을 나열 할 수 있습니다. 때문에 내비게이션 바의iPhone - UITableView - 내가 돌아 가면 데이터가 손실됩니다.

testDetailViewController *testDetailViewController = [[TestDetailViewController alloc] initWithNibName:@"TestDetailView" bundle:[NSBundle mainBundle]]; 
    testDetailViewController.title = testClass.name; 
    testDetailViewController.myKey = testClass.keyId; 
    [[self navigationController] pushViewController:testDetailViewController animated:YES]; 
    [testDetailViewController release]; 
    testDetailViewController = nil; 

: 지금은

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

이 줄을 추가

: - (http://developer.apple.com/iphone/library/samplecode/TableSearch/index.html TableSearch) 그래서 나는있는 NSMutableArray하는 listContent 애플의 예에서와 같은 filteredListContent이 있습니다 , "뒤로"버튼이 있습니다. 이 버튼을 클릭하면 TableView가 비어 있고 일치/조회가 없습니다. 내가해야 할 일이 있으므로 콘텐츠가 계속 남아있게됩니까?

아는 사람 있습니까?

미리 감사드립니다. & 최고 감사합니다.

소스 코드 :

@implementation SearchViewController 

@synthesize listContent, filteredListContent, savedSearchTerm, savedScopeButtonIndex, searchWasActive; 

- (void)viewDidLoad { 
    // restore search settings if they were saved in didReceiveMemoryWarning. 
    if (self.savedSearchTerm) { 
     [self.searchDisplayController setActive:self.searchWasActive]; 
     [self.searchDisplayController.searchBar setSelectedScopeButtonIndex:self.savedScopeButtonIndex]; 
     [self.searchDisplayController.searchBar setText:savedSearchTerm]; 
     self.savedSearchTerm = nil; 
    } 
} 

- (void)viewDidUnload { 
    // Save the state of the search UI so that it can be restored if the view is re-created. 
    self.searchWasActive = [self.searchDisplayController isActive]; 
    self.savedSearchTerm = [self.searchDisplayController.searchBar text]; 
    self.savedScopeButtonIndex = [self.searchDisplayController.searchBar selectedScopeButtonIndex]; 
    self.filteredListContent = nil; 
} 

- (void)dealloc { 
    [listContent release]; 
    [filteredListContent release]; 
    [super dealloc]; 
} 

- (void)setData { 
    self.listContent = [NSMutableArray arrayWithCapacity:3]; 
    [self.listContent addObject:[SearchObjects itemWithType:@"AAA" name:@"Test1"]]; 
    [self.listContent addObject:[SearchObjects itemWithType:@"BBB" name:@"Test2"]]; 
    [self.listContent addObject:[SearchObjects itemWithType:@"BBB" name:@"Test3"]]; 

    // create a filtered list 
    self.filteredListContent = [NSMutableArray arrayWithCapacity:[self.listContent count]]; 
    [self.tableView reloadData]; 
    self.tableView.scrollEnabled = YES; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    //If the requesting table view is the search display controller's table view, return the count of the filtered list, otherwise return the count of the main list. 
    if (tableView == self.searchDisplayController.searchResultsTableView) { 
     return [self.filteredListContent count]; 
    } else { 
     return [self.listContent count]; 
    } 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *kCellID = @"cellID"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellID]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellID] autorelease]; 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    } 

    /* If the requesting table view is the search display controller's table view, configure the cell using the filtered content, otherwise use the main list. */ 
    SearchObjects *searchObject = nil; 
    if (tableView == self.searchDisplayController.searchResultsTableView) { 
     searchObject = [self.filteredListContent objectAtIndex:indexPath.row]; 
    } else { 
     searchObject = [self.listContent objectAtIndex:indexPath.row]; 
    } 
    cell.textLabel.text = searchObject.name; 
    return cell; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    // HERE IS THE SOURCE CODE FOR PUSHING TO THE NEXT VIEW 
} 

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { 
    // DO SOME CALCULATIONS… AND THE setData METHOD IS CALLED 
} 

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope { 
    /* Update the filtered array based on the search text and scope. */ 
    [self.filteredListContent removeAllObjects]; // First clear the filtered array. 

    /* Search the main list for whose type matches the scope (if selected) and whose name matches searchText; add items that match to the filtered array. */ 
    for (SearchObjects *searchObject in listContent) { 
     if ([scope isEqualToString:@"All"] || [searchObject.type isEqualToString:scope]) { 
     NSComparisonResult result = [searchObject.name compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])]; 
      if (result == NSOrderedSame) { 
       [self.filteredListContent addObject:searchObject]; 
      } 
     } 
    } 
} 

- (void)filterContentForScope:(NSString*)scope { 
    /* Update the filtered array based on the search text and scope. */ 
    [self.filteredListContent removeAllObjects]; // First clear the filtered array. 

    /* Search the main list for whose type matches the scope (if selected); add items that match to the filtered array. */ 
    for (SearchObjects *searchObject in listContent) { 
     if ([scope isEqualToString:@"All"] || [searchObject.type isEqualToString:scope]) { 
      [self.filteredListContent addObject:searchObject]; 
     } 
    } 
} 

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { 
    [self filterContentForScope:[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];  
    // Return YES to cause the search result table view to be reloaded. 
    return YES; 
} 

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption { 
    [self filterContentForScope:[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]]; 
    // Return YES to cause the search result table view to be reloaded. 
    return YES; 
} 
@end 

답변

0

해결되었습니다. 그것은 주어진 소스 코드에서 명백하지 않은 문제였습니다. 내 논리에 오류가 있습니다.

1

당신은 일반적으로이 경우에는 아무것도 할 필요가 없습니다, 데이터는 그대로 유지한다. 데이터를 언로드하는 것이 있습니까? 배열을 언로드하는 viewWillDisappear 함수가 있습니까? viewWillAppear에서 배열 설정 중 일부를 수행하고 있습니까?

메쏘드의 시작 부분에 log 문을 써서 그들이 언제 호출되는지를 알면, 무슨 일이 일어나고 있는지 더 명확하게 알 수 있습니다.

+0

TableView가있는 내 ViewController의 소스 코드를 추가했습니다. viewWillAppear/viewWillDisappear 호출이 없습니다. – Tim

관련 문제