2013-01-09 4 views
0

저는 앱이 있으며 (지금은 아키텍처를 변경할 수 없습니다).이전보기 컨트롤러를 모달로 표시 할 수 없습니다.

페이지 1은 presentModalViewController와 함께 (Tabnav)를 제공합니다. 그러면 Page 2는 presentModalViewController와 함께 (버튼을 통해) Page 1을 제공 할 수 있습니다.

문제는 페이지 1이 이미 표시 되었기 때문에 페이지 1을 다시 표시 할 때 응용 프로그램이 충돌하는 것입니다. 나는 페이지 1을 보여주는 2 페이지를 기각 할 수는 있지만, 그 옵션을 취할 수는 없다. 왜냐하면 모달로 표현 될 수있는 다른 페이지가 있기 때문에 페이지 1 대신 스택 아래에 레벨이 있기 때문이다.

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Application tried to present modally an active controller <AccountViewController: 0xc3824a0>.' 
*** First throw call stack: 
(0x1f3d012 0x1a32e7e 0xa63721 0xa64777 0xa647b7 0x908e 0x1a46705 0x97d920 0xbb9b24 0x1a46705 0x97d920 0x97d8b8 0xa3e671 0xa3ebcf 0xa3dd38 0x9ad33f 0x9ad552 0x98b3aa 0x97ccf8 0x2e48df9 0x2e48ad0 0x1eb2bf5 0x1eb2962 0x1ee3bb6 0x1ee2f44 0x1ee2e1b 0x2e477e3 0x2e47668 0x97a65c 0x258d 0x24b5 0x1) 
libc++abi.dylib: terminate called throwing an exception 
+0

우리에게 충돌 로그를 보여 주시면 ** 어쩌면 ** 우리는 당신을 도울 수 있습니다 – MCKapur

+1

그것은 악몽처럼 들리기 때문에 건축물의 적어도 일부분을 변경해야하는 것처럼 들립니다. 설명을 올바르게 읽는다면 모달 뷰 컨트롤러를 제시하면 안됩니다. – rooster117

+1

크래시는 아직 여기에있는 뷰를 표시하려고 할 때 완전히 정상입니다 (2 페이지 배경을 참조하십시오). 하지만 난 아직도 당신이 그것을 기각 할 수없는 이유를 이해할 수 없다. plz 자세한 내용을 제공합니다. – Yaman

답변

1

클래스와 인스턴스의 차이점을 이해하고 있습니까? AccountViewController를 표시하려면 AccountViewController 인스턴스와 다르게 지정해야합니다. 당신이하려고하는 것은 이미 인터페이스에있는 매우 동일한 AccountViewController 인스턴스를 제공하는 것 같습니다. 분명히 불가능합니다.

나는 당신의 인터페이스가 나쁜 디자인이라는 것에 다른 사람들과 동의하지만, 적어도 이것은 당신이 묻는 언어 적 질문에 답합니다.

+0

을 사용해 주셔야합니다. 감사합니다. 각 뷰 컨트롤러의 인스턴스가 하나 뿐인 것 같습니다. App cycle마다 완전히 잘못된 것 같군요. – Baconbeastnz

+0

인스턴스는 인스턴스입니다. 클래스의 전체적인 점은 필요한만큼 여러 번 인스턴스화 할 수 있다는 것입니다. 예를 들어, UIPageViewController를 한 번에 두 페이지. MyCoolPage보기 컨트롤러 클래스로 표시되는 한 페이지 유형 만있는 경우 분명히 최소한 두 개의 인스턴스가 필요합니다. 항상 그 수업 시간에. – matt

1

다시 1 페이지를 표시 할 경우, 현재 뷰 컨트롤러 (즉, 2 페이지)를 해제한다 있거나, 사용자가 페이지 1의 새로운 인스턴스를 생성하고 모달 것을 제시한다.

이미 존재하는보기 컨트롤러에있는 경우 아무 것도 제시하지 않는 것이 좋습니다.

모달 vc를 제시 한 다음이를 닫아야합니다. 그게 틀림 없어.

OP를 다시 읽으십시오. 진지하게, 구조를 폐기하고 재 설계하십시오. 네가 가진 것은 뒤죽박죽 인 것 같다. 왜 네비게이션 컨트롤러를 사용하지 않을까요?

1

Page2Page1Page1이 이미 모달 스택에 표시 할 수 없습니다. "Page1가 이미 제시되었습니다."라는 말은 Xcode의 약자입니다.

모달 스택을 계속 사용해야 할 때 할 수있는 일은 신중하게 표현해야합니다. 언제든지 ViewController OR을 표시하고 언제든지 ViewControllers을 기각하여 페이지를 볼 수 있습니다. 스택의 특정 페이지로 '이동'할 수 있습니다.

this question에 wL_의 대답은 (선택기 이름은 아이폰 OS 6에 약간 변경 한주의) 한 번에 두 개 이상의 모달 ViewController을 해제하는 방법에 대한 설명을 시작하기에 좋은 장소입니다. 물론 모달 값이 많으면 ViewControllers을 사용하면 각 페이지가 스택에있는 곳을 추적하는 데 상당한 메모리를 소비하게됩니다.

나는 이것이 다소 나쁜 디자인이라는 것을 지적해야하지만 아키텍처를 변경할 수 없다고 말했기 때문에 이것이 문제를 해결하는 한 방법입니다.

의사 코드 : 내가 말하는대로

Button pressed to jump to page: 
    PageIsInStackAlready? 
     Yes 
      Calculate/retrieve page position in stack 
      Dismiss necessary number of ViewControllers 
     No 
      Present new modal ViewController 
      Store/account for new page's location on stack 

이 작동 할 수 있지만 그것은 확실히 시스템을 싸우고.

관련 문제