2013-04-05 4 views
6

내 앱에서 Storyboard을 사용하고 있는데 한보기에서 다른보기로 데이터를 전달하고 싶습니다.instantiateViewControllerWithIdentifier 및 패스 데이터

하위 태그를 사용하는 대신 instantiateViewControllerWithIdentifier을 사용하고 있습니다. 이 경우에는 내 첫 번째 TableViewController에서 NavigationController으로 인스턴스화되며 두 번째 TableViewController에서 내비게이션이 필요하기 때문에 두 번째 TableViewController이 연결됩니다. 이제 클릭 한 행에 따라 내 첫 번째 TableviewController의 데이터를 내 두 번째 TableviewController으로 전달하고 싶습니다. 이 경우 newTopViewController이 내 NavigationController이되지만 내 문제는 현재 firstTableViewController에서 secondTableviewController으로 데이터를 전달하는 방법입니다. 내 앱의 몇 가지에 꽤 자주 이렇게 enter image description here

+0

가능한 중복 (http://stackoverflow.com/questions/5210535/passing-data-between-view-controllers) –

+0

이 게시물에서 솔루션을 볼 수 없습니다. Isegues를 사용하지 않기 때문에 인스턴스화 컨트롤러를 사용하고 있습니다. 그럼 난 여전히 준비를 사용합니까 segue 없다는 것입니다? – halloway4b

+0

보기 컨트롤러가 인스턴스화 된 곳에서 메시지를 전달하는 방법을 변경해서는 안됩니다. –

답변

14

navigationController를 인스턴스화하면 viewControllers 속성을 사용하여 탐색 컨트롤러의 내부 viewController를 가져올 수 있습니다. 이 같은

뭔가 :이 프로그램 제어 및 데이터 전송 질문 함께 같이

UINavigationController *navigationController = [self.storyboard instantiateViewControllerWithIdentifier:identifier]; 
MBFancyViewController *viewController = navigationController.viewControllers[0]; 

// setup "inner" view controller 
viewController.foo = bar; 

[self presentViewController:navigationController animated:YES completion:nil]; 
+0

당신은 그것을 못 박았습니다. 많은 감사합니다. 이 힌트로 나는 UINavigationController가 topViewController라는 속성을 가지고 있다는 것을 알았습니다. 많은 감사합니다. 두 가지 방법으로 매력을 발휘합니다. 나는 당신의 대답을 다른 방법으로 편집했다. – halloway4b

+0

놀라운 솔루션입니다. 그것은 나를 많이 도왔다. 많은 감사 –

5
newTopViewController.anyVariableToShow= anyVariableToSend; 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     NSString *identifier = [NSString stringWithFormat:@"%@Top", [menuArray objectAtIndex:indexPath.row]]; 


     UIViewController *newTopViewController = [self.storyboard instantiateViewControllerWithIdentifier:identifier]; 




    } 

... 당신이하지 않은 경우

// 새로운 VC

CookViewController *detailViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"CookVC"]; 

//Set recipe 
[detailViewController setRecipe:recipe]; 

//Pop over VC (can be pushed with a nav controller) 
[self presentPopupViewController:detailViewController animationType:MJPopupViewAnimationFade]; 

만들기 네비게이션 컨트롤러 또는 segues를 사용하면 앱 디자인을 재고해야한다고 생각합니다.

+0

newTopViewController는 NavigationController이지만 secondTableViewController에 데이터를 전달하려고합니다. – halloway4b

+0

새로운 상위보기 컨트롤러로 표시 –

+0

내가 말하는 경우 newTopViewController.title = @ "무엇이든"; secondTableviewController가 Navigationbar와 함께 표시되기 때문에 제목이 변경되지 않습니다. secondTableViewController를 직접 인스턴스화하면 secondTableViewController.title = @ "무엇이든"과 같은 데이터를 전달할 수 있지만 내 tableview에는 Navigationbar가 없습니다. – halloway4b

0

사실 그것은 단지 데이터 전달 문제가 아니에요. 스토리 보드의 의미가 아니라 스토리 보드를 사용하고자 할 때 앱의 개념에 대해 다시 생각해 봐야합니다. 귀하에게 달려 있으며, 자신이하는 일을해야 할 충분한 이유가 있기를 바랍니다.

그래서 segue를 사용하지 않기로 결정했을 때 새로운 컨트롤러를 인스턴스화하고 데이터를 전송하는 새롭고 편안한 방법을 잃어 버렸습니다. 그리고 두 가지 단계로 컨트롤과 데이터를 전송해야합니다. 스토리 보드에서 다른 장면을 인스턴스화하면 (instantiateViewControllerWithIdentifier와 같이 :) 새 컨트롤러를 인스턴스화하고 컨트롤은 전송하지만 데이터는 전송하지 않습니다. 옛날 방식으로 xib에서 새 컨트롤러를 인스턴스화 할 때 생각해보십시오 (그래서 스토리 보드가 initWithName : bundle :)을 호출하지 않으므로 두 번째보기 컨트롤러에서 initWithCoder : 또는 awakeFromNib를 사용해야하지만 더 이상 아무것도하지 않았습니다. .

그래서 두 번째 스토리 보드의 정체성 부분에 이름이 지정된 컨트롤러가 있습니다. 스토리 보드 그림이 멋지게 묘사 한 것처럼 다른 관계 나 관계없이 우주에 매달려 있습니다. 그러면 할 수 있습니다. 그것으로 당신이 원하는 것.

그래서 뭔가하고 싶으시고 이전 스토리 보드 (ViewController)의 데이터가 필요합니다. 필요한 것은 두 번째 스토리 보드 (ViewController)에 해당 데이터를 제공하는 것입니다. 스토리 보드가 존재하기까지 오랫동안 사용할 수 있었던 많은 솔루션이 있습니다.

그래서 코드에 관해서는 "데이터 전송"은 두 컨트롤러가 서로의 서브 클래스인지 여부에 관계없이 디자인에 따라 달라집니다.

서브 클래 싱을 다루지 않으려하고 가능한 한 많이 분리하려는 경우 가장 좋은 방법은 첫 번째 컨트롤러에서 데이터의 속성을 만들고 두 번째 컨트롤러에서 데이터를 참조하는 것입니다 (첫 번째 컨트롤러를 가져온 후 당신이 그들을 필요로하는 곳에 당신이 역으로 동일한 작업을 수행하고, 두 번째 컨트롤러의 속성을 확인하고 참조 할 수 있습니다

물론
secondViewControllerdata = firstViewControllerdata.thatDataProperty 

으로, 또는 어느 곳 : 파일 .H) 및 단지에서 참조있는 viewDidLoad 또는 initWithCoder에 있어요 귀하의 첫 번째보기 컨트롤러에서.

당신의 UIViewController에서 몇 가지 매개 변수를 정의 할 수 있습니다
0

가 데이터를 수신 할 :

@property (지정) INT PARAM1;

@property (보유) NSMutableArray * param2;

및 데이터를 전달하기 위해 아래 사용

[newTopViewController setParam1 : XX]

[newTopViewController setParam2 : XX]; [보기 컨트롤러 사이에 데이터를 전달]의

관련 문제