2012-02-17 1 views
5

따라서 스토리 보드를 사용하면 첫 번째 tableViewController에서 detailViewController까지 UITableViewCell에서 세그를 만들 수 있습니다.UISearchBarDisplayController 결과에서 detailViewController로 이어지는 방법

그러나 UISearchBarDisplayController가 스토리 보드 믹스에 도입되면 너무 복잡해지지 않습니다. 어떻게 결과 셀을 detailViewController로 향하게 할 수 있습니까? http://clingingtoideas.blogspot.com/2010/02/uitableview-how-to-part-2-search.html 내가 할 수있는 모든 검색에서 행을 선택입니다

,이 파란색으로 변과 detailViewController로 이동하지 않습니다 나는 문제없이 검색 할 수 있어요

, 나는이 튜토리얼을 따라 갔다.

검색되지 않은 셀에서 작동하는 prepareForSegue 메서드를 구현했지만이 셀을 찾을 수 없습니다.

+0

/How/how는'prepareForSeque : sender :'를 구현 했습니까? http://stackoverflow.com/questions/10033279/prepareforsegue-after-uisearchdisplaycontroller/19814031#19814031 – hop

답변

0

가 좋아 나는 그것이 해킹의 비트처럼 보인다, 내가 그것을 가지고 생각하지만 내 목적을 위해 작동 : 나는 스토리 보드를 사용하고

: 내가 직접 그 위에 UISearchBarDisplayController와 jQuery과 컨트롤러를 가지고있다. 드래그 앤 드롭만으로는 코드가 없습니다. 나만이 아닌 검색 배열, 원래의 배열에서 셀을 표시 할 수 것입니다 : 거기에서

, 나는 검색 창 올바르게 http://clingingtoideas.blogspot.com/2010/02/uitableview-how-to-part-2-search.html

그러나 prepareForSegue 검색 갈 수있는이 튜토리얼을 따라 갔다.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (savedSearchTerm) { 
    searchRowSelected = indexPath.row; //<-- the trick that worked 
    [self performSegueWithIdentifier:@"ShowDetail" sender:self]; 
} 
} 

searchRowSelected 내가 클래스의 상단에 선언하는 int 변수입니다 :

그래서 나는 didSelectRowAtIndexPath을 사용했다.

didSelectRowAtIndexPath : 내가 선택한 행을 알고 있지만 prepareForSegue는 알지 못했습니다. 왜 그 변수가 필요한지. 내가 prepareForSegue에서 그것을 사용하는 방법을

은 다음과 같습니다

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 
if ([segue.identifier isEqualToString:@"ShowDetail"]) { 

    dvc = [segue destinationViewController]; 

    NSIndexPath* path = [self.tableView indexPathForSelectedRow]; 
    int row = [path row]; 

    if (savedSearchTerm){ //set the detailViewController with the searched data cell 
     myDataClass* c = [searchResults objectAtIndex:searchRowSelected]; 
     dvc.myDataClass = c; 
    }else{ //set the detailViewController with the original data cell 
     myDataClass* c = [array objectAtIndex:row]; 
     dvc.myDataClass = c; 
    } 
} 
} 

또한 사람이 더 나은 솔루션이있는 경우 savedSearchTerm에게

-(void) searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller{ 
    [self setSavedSearchTerm:nil]; 
} 

을 정리하기 위해이 코드를 사용 나는 모든 귀 해요 :)

+5

에서 간단한 구현을 설명했습니다. searchDisplayController.active를 검사하여 현재 tableview를 결정하는 것은 어떻습니까? –

2

당신의 솔루션을 시도한 결과, prepareForSegue가 수명주기로 인해 번 호출되었고 didSelect ... -> performSegueWithIdentifier가 호출됨을 발견했습니다.

  1. 자체가 : prepareForSegue : 대상 컨트롤러 객체 (잘못된 인덱스)로 설정
  2. 최종 도착하기 때문에 :있는 viewDidLoad : 대상 컨트롤러 뷰로드되는
  3. 자기 후 : didSelectRow ... : 인덱스 알고 있고 올바르게 설정되어 있습니다.
  4. self : prepareForSegue : 개체가 이제는 올바르지 만 부작용이 없습니다.

나는 그 때 didSelect에 집중했다 ...

//DestinationViewController 
- (IBAction)back:(id)sender 
{ 
    [self.navigationController popToRootViewControllerAnimated:YES]; // list 
    [self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; // map 
} 
: I가 이어질지도보기,에서 SEGUE 을 수행하기 때문에

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    DestTableViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"DestViewController"]; 

    CustomObj *custObj = nil; 

    if (tableView == self.searchDisplayController.searchResultsTableView) { 
     custObj = [filteredListContent objectAtIndex:indexPath.row]; 
    } else { 
     storeToDetail = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
    } 

    controller.custObj = custObj; 

    [self.navigationController setNavigationBarHidden:NO]; 
    [self.navigationController pushViewController:controller animated:YES]; 
    // presentViewController::animated:completion is always full screen (see problem below) 
} 

내가 다시가는 몇 가지 문제를 경험 : 나는이 SEGUE을 삭제하고 프로그램보기를 누르면이 솔루션을 함께했다

하지만이 방법은 효과가 없습니다.

그러나 첫 부분은 쉽고 깨끗하며 어쩌면 그것은 당신에게도 효과가 있습니까?!

4

다음은 @James Chen의 의견을 기반으로 한 해결책입니다. 또한 테이블이있는 상태에 따라 다른 IndexPath를 사용하십시오.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 

    if ([[segue identifier] isEqualToString:@"toDetail"]) { 

     Person *person = nil; 

     if (self.searchDisplayController.active == YES) { 
      NSIndexPath *indexPath = indexPath = [self.searchDisplayController.searchResultsTableView indexPathForSelectedRow]; 
      NSLog(@"segue - section: %d, row: %d", indexPath.section, indexPath.row); 

      person = [self.filteredPersonArray objectAtIndex:indexPath.row]; 
     } 
     else { 
      NSIndexPath *indexPath = indexPath = [self.tableView indexPathForSelectedRow]; 
      NSLog(@"segue - section: %d, row: %d", indexPath.section, indexPath.row); 

      person = [self.personArray objectAtIndex:indexPath.row]; 
     } 

     [[segue destinationViewController] setPerson:person]; 

    } 
}