3

간단한 테스트 응용 프로그램에서 "thisArray"라는 배열 객체를 MasterViewController에서 DetailViewController의 "passedData"라는 문자열로 전달하려고했습니다. 나는 스토리 보드를 사용 중이며 UIViewController은 내비게이션 컨트롤러 안에 내장되어있다. prepareForSegue 방법을 사용하여, 나는 성공적으로 UIViewController 사이에 데이터를 전달 :보기 컨트롤러간에 데이터 전달 DidSelectRowsAtIndexPath Storyboards

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([segue.identifier isEqualToString:@"pushData"]) { 
     NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
     DetailViewController *destViewController = segue.destinationViewController; 
     destViewController.passedData = [thisArray objectAtIndex:indexPath.row]; 
    } 
} 

을 지금 내가 대신 prepareForSeguedidSelectRowsAtIndexPath를 사용하려면 몇 가지 이유. 나는 이것을 사용했다 :

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSMutableString *object = thisArray[indexPath.row]; 
    detailViewController.passedData = object; 
} 

그러나 그것은 작동하지 않았다. 나는 다음을 사용했다 :

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil]; 

    NSMutableString *object = thisArray[indexPath.row]; 
    detailViewController.passedData = object; 
    [self.navigationController pushViewController:detailViewController animated:YES]; 
} 

그러나 그것은 또한 작동하지 않았다.

질문 :

1) 어떻게 제대로 prepareForSegue을 대체 할 didSelectRowsAtIndexPath를 작성?

2) 내가 didSelectRowsAtIndexPath 사용하는 경우, 나는 스토리 보드에서 UIViewController 사이의 SEGUE의 연결을 제거해야합니까?

3) 실제로보기 컨트롤러간에 연결이 끊어지지 않으면 어떻게 didSelectRowAtIndexPath을 사용하여 데이터를 전달할 수 있습니까?

감사합니다.

업데이트 : 대답과 내가 접수 된 의견을 바탕으로, 내가 다음 썼다 : 스토리 보드 ID DetailViewController을 설정

먼저 내가 컨트롤러 사이의 SEGUE 연결을 제거 한 클래스의 이름도 DetailViewController.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UIStoryboard* sb = [UIStoryboard storyboardWithName:@"DetailViewController" 
                bundle:nil]; 
    UIViewController* vc = [sb instantiateViewControllerWithIdentifier:@"DetailViewController"]; 

    NSMutableString *object = thisArray[indexPath.row]; 
    detailViewController.passedData = object; 
    [self.navigationController pushViewController:detailViewController animated:YES]; 
} 

하지만이 다음 오류와 함께 추락하기 :

*** Terminating app due to uncaught exception NSInvalidArgumentException , reason: 'Could not find a storyboard named DetailViewController in bundle

+0

참조 dasblinkenlight의 편집 및 자신에 업데이트 된 코드를 변경 : 여기에 귀하의 방법이 어떻게 보일지입니다. 당신이하려고하는 것을 돌봐야합니다!:) – lnafziger

+0

예 완료되었습니다. 감사! – AJ112

답변

10

두 번째 시도가 거의 권리입니다. 아주 정확하지 않은 유일한 방법은 스토리 보드에서보기 컨트롤러를 인스턴스화하는 방법입니다. initWithNibNamed:을 사용합니다. 이는 NIB와 함께 사용하지만 스토리 보드에서는 사용하지 않습니다. 스토리 보드의 경우 다음이 필요합니다.

UIStoryboard* sb = [UIStoryboard storyboardWithName:@"theStoryboardId" 
              bundle:nil]; 
// If this code is inside a method called by a controller that is itself instantiated 
// from a storyboard, you can replace the above line with this.storyboard 
UIViewController* detailViewController = [sb instantiateViewControllerWithIdentifier:@"DetailViewController"]; 

자세한 내용은 this question을 참조하십시오.

바꾸기를 수행하면 코드가 예상대로 작동합니다.

편집 : : 아래

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UIViewController* detailViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"]; 
    NSMutableString *object = thisArray[indexPath.row]; 
    detailViewController.passedData = object; 
    [self.navigationController pushViewController:detailViewController animated:YES]; 
} 
+2

다른 스토리 보드로가는 경우 해당 구문이 유용하다는 것은 분명합니다. 하지만 동일한 스토리 보드 인 경우, 'UIViewController * vc = [self.storyboard instantiateViewControllerWithIdentifier : @ "DetailViewController"];' – Rob

+0

'과 같은'self.storyboard '를 사용하면 이러한보기 컨트롤러 간의 연결을 제거해야합니까? "vc"를 사용하여 데이터를 전달하는 방법은 무엇입니까? – AJ112

+0

@ AJ112 그래, 당신은 segue를 제거해야합니다. 나머지 메소드는 변경되지 않고'detailViewController.passedData = object; '를 사용하여 데이터를 전달합니다. – dasblinkenlight

관련 문제