2013-04-17 2 views
0

문제가 생겨서 문제를 해결할 수 없습니다!NSObject에서 여러 viewcontroller 푸시

다음 시나리오는 입니다. 4 개의보기 컨트롤러 (기본보기 컨트롤러는 UITableView, settingsVC, messsageDetailController 및 moreInfoVC)입니다. - 수신 할 다른 이벤트의 포트를 수신하는 수신기 (NSObject)도 있습니다.

다음은 기능입니다. - 리스너를 시작하여 해당 이벤트를 수신합니다. 리스너가 새 이벤트를 수신하면이 리스너는 mainViewController와 통신하고이 mainVC에서 messageDetailController의 새 인스턴스를 만듭니다. 아래의 코드 (mainVC)를 사용하여 * 임 : 나는이 모든 기능을 가지고 있지만, 내 청취자가 하나 개 이상의 이벤트를 수신 한 후, 그 결과, 나는 더 이상 messageDetailController 참조를 만들 때 내 문제가 시작

[self performSegueWithIdentifier:@"MessageDetail" sender:self]; 

. 그 문제는 내 메시지를 내게 내 NavigationController에 직접 영향을 미친다. - 중첩 된 푸시 애니메이션으로 인해 탐색 모음이 손상 될 수있다. - 모양의 시작/종료 전환이 불균형하다. - 예기치 않은 상태에서 탐색 전환 완료. 탐색 바 하위 뷰 트리가 손상 될 수 있습니다.

내가 제대로 자신을 설명하고 누구든지 나를 도울 수 있기를 바랍니다.

+0

그것은 당신이 원하는 행동에 대한 자세한 내용을 모르고 당신을 조언하기 어렵다. 청취자가 두 번째 행사를 수신 할 때 무엇을하고 싶습니까? messageDetailController가 새 이벤트에 대해서만 표시하도록 하시겠습니까? 두 이벤트에 대한 정보를 표시하고 새 이벤트가 추가 될 때 계속 추가 하시겠습니까? – rdelmar

+0

나는 청취자에게받은 새로운 정보 만 보여주고 싶다. 그게 내가 왜 새로운 messageDetailController를 만들지 ... 솔직히 말해서 그 최선의 아이디어가 ... 잘 모르겠다. – rubrin

답변

0

솔루션 :

NSMutableArray *array = [NSMutableArray arrayWithArray::self.navigationController.viewControllers]; 

for(NSInteger i = ([array count] - 1); i > 0; i--) 
    if(i != 0) 
     [array removeObjectAtIndex:i]; 

self.navigationController.viewControllers = array; 

[self performSegueWithIdentifier:@"MessageDetail" sender:[settingsReference actualView]]; 
0

segue가 항상 새보기 컨트롤러를 만들기 때문에 여기에서 수행하려는 작업을 수행하는 데 segue를 사용하지 않을 수도 있습니다. 코드에서 messageDetailController를 푸는 것이 더 좋을 것입니다. 컨트롤러에 하나의 존재하지 않는 컨트롤러 만 생성하고 푸시하는 if 절을 넣을 수 있습니다. 두 번째 이벤트가 들어 오면 표시하려는 값만 변경하면됩니다. 이 코드는 다음과 같을 수 있습니다 (주 뷰 컨트롤러에서 리스너로부터 정보를 얻는 경우).

if (! messageDetailController) { 
    MessageDetailController *messageDetailController = self.storyboard instantiateViewControllerWithIdentifier:@"MessageController"]; 
    messageDetailController.detailItem = infoFromListener; 
    [self.navigationController pushViewController:messageDetailController animated:YES]; 
}else{ 
    messageDetailController.detailItem = infoFromListener; 
} 
+0

Im은 여전히 ​​같은 행동을하고있다. 예를 들어, 다른 뷰 컨트롤러 (settingsVC)에 있고이 경우 리스너가 새 메시지를 받으면이 메시지가 messageDetailController에 표시됩니다. 그러나, 내가 mainVC (rootVC이기 때문에)로 가기 위해 뒤로 버튼 (messageDetailController)을 눌렀을 때, 내 navigationController는 이전 barNavigationController (settingsCV)를 보여줍니다 .... – rubrin

+0

@rubrin, 귀하의 주문이 mainVC 인 경우 - -> settingsVC -> messageDetailVC 그 때 당신이 얻으려는 행동입니다. 그러지 않으려면 다른 디자인을해야합니다. 새 메시지가 들어올 때 어떤 일이 일어나길 원하는지 명확하지 않습니다. messageDetailVC를 업데이트 할뿐만 아니라보고있는보기에 관계없이 그 vc를 표시하려고합니까? 업데이트를 원하지만 다시 돌아올 때까지 사용자에게 표시되지 않습니까? 당신이 원하는 것에 대한 자세한 내용을 기입해야합니다. 일반적으로 설정 컨트롤러는 다른 vc 사이의 경로에 있지 않습니다. – rdelmar

+0

사용자는 다른 VC 중 하나에있을 수 있습니다. 주문은 mainVC-messageDetailVC-moreInfoVC 및 mainVC-settingsVC입니다. 그래서 VC가 독립적으로, 청취자가 새로운 메시지를 받으면 그것을 보여주고 싶습니다.나는 지금 그것이 충분히 명확하게 희망한다. thanks rdelmar – rubrin

관련 문제