문제

uiviewController ( "FormController"라고 부르겠습니다. 이것은 단순히 객체를 편집하는 형식입니다. 두 가지 상황에서 사용하고 싶습니다.

  1. UinavigationController를 사용하여 새 개체 생성 presentModalViewController: 방법.

  2. 기존 객체 편집 - 뷰 컨트롤러를 대화 상자 메소드를 사용하지 않고 UinavigationController 스택으로 푸시하십시오.

모달 상황에서는 "취소"및 "완료"버튼이있는 도구 모음을 갖고 싶지만 스택 상황에서는 UinavigationController에서 내비게이션 바를 제공하고 싶습니다.

이는 "새 연락처"및 "편집 연락처"화면이 동일한보기 컨트롤러를 사용하는 것처럼 보이는 연락처 애플리케이션과 유사하지만 편집 화면이 내비게이션 스택에 푸시되는 동안 새로운 연락처 양식이 모드로 표시됩니다.

내 질문은 : 별도의 두 가지이지만 대부분 동일한보기 컨트롤러를 쓰지 않고 두 상황을 처리하는 가장 좋은 방법은 무엇입니까?

작곡을 통해 Bare "FormController"를 캡슐화하고 도구 모음을 추가하는 "ModalFormController"를 작성하는 것에 대해 생각했지만 Apple이 둥지 뷰 컨트롤러를 권장하지 않는 문서의 어딘가에 읽습니다.

도움이 되었습니까?

해결책

내가하는 일 (때로는)은 enum 뷰 컨트롤러의 유형을 지정합니다.

예를 들어, 두 가지 유형이있을 수 있습니다. Edit 유형 및 an Add ( "새로운") 유형.

그만큼 Add 유형은 모달 뷰 컨트롤러를 통해 구현되며 Edit 유형은 기존 내비게이션 스택으로 밀립니다.

보기 컨트롤러에서 -viewDidLoad: 방법, 나는 단순히 a를한다 switch/case 위에 지정된 유형 열거에 따라 제목 및 기타 모양 특성을 설정하는 트리.

이것에 대한 좋은 점은 새로운 유형을 추가하기가 쉽다는 것입니다. 단점은이 열거를 건네주기위한 조건부 트리가 유형의 다른 방법에 따라 빠르게 복잡해질 수 있다는 것입니다.

하지만 switch/case 트리는 관리하기가 훨씬 쉬워집니다.

따라서 두 가지 유형으로 무엇을하려고하는지에 따라 다릅니다. 그러나 그것은 확실히 가능합니다.

다른 팁

하위 클래싱을 사용하지 않는 이유는 무엇입니까? 만들다 ModalCreateFormController 서브 클래스 EditFormController 서브 클래스의 모달 별 물건을 처리하십시오.

Alex Reynolds에서 알 수 있듯이보기 컨트롤러에 명시적인 속성을 갖는 것 외에도 다음과 같은 두 가지 접근 방식이 다음과 같습니다.

  1. 편집하는 종류의 모델 객체가있는 경우 현재 상태를 요청하십시오. 저장된 적이 있다면 편집 모드에 있습니다. 그렇지 않으면, 당신은 생성 모드에 있습니다.

  2. 컨트롤러의 가치를보십시오 parentViewController 재산. 인스턴스 인 경우 UINavigationController, 당신은 탐색 스택에 있습니다. 모드로 표시되는 경우 목록 컨트롤러의 인스턴스가됩니다.

어, 나는 여분의 이바를 싫어한다…

대신 이것을 사용합니다.

if([[self.navigationController viewControllers] objectAtIndex:0] == self){

        //Modal

    }else{

        //Pushed

    }

그것은 약간의 해킹이지만, 우리는 불쾌한보기 컨트롤러가 스택에서 첫 번째라면 다시 갈 수 없다는 논리를 사용하고 있습니다. 실제로 우리는 그것이 모드로 표시되는지의 사실을 무시하고 있습니다.

나는 내 앱에서 이것을 여러 번해야했고 Modal 서브 클래스 및 ForwardInvocation을 사용한 재사용 가능한 모달 헬퍼 클래스를 포함하여 몇 가지 다른 방법을 시도한 후에해야했습니다. 가장 좋은 패턴은 포함 된 modalViewController 메소드를 만드는 것이 었습니다. 각보기 컨트롤러가 (일반적으로) 발신자가 presentModalViewController와 함께 사용할 수 있도록 UinaVigationController를 생성하고 반환합니다.

대부분의 경우이 메소드는 root보기 컨트롤러로 SELF를 사용하여 UinaVigationController를 구축하고 반환합니다 (Self.NavigationController를 확인하는 메소드를 반복적으로 호출하고 대신 NIL이 아닌 경우 반환). 다른 경우에는 더미 루트 컨트롤러를 먼저 만들고 뒤로 버튼을 가져 오기 위해 자체를 두 번째로 밀었습니다. 그런 다음 트릭을 사용하여 뒤로 버튼을 잡을 수 있습니다. http://smallduck.wordpress.com/2010/05/intercepting-uinavigationcontroller/

경우에 따라보기에는 탐색 표시 줄이 필요하지 않으므로이 방법은 일부 플래그를 조정하고 자체를 반환합니다. 내비게이션 바가 필요한 경우에도 그 방법이 self를 호출하는 것이 더 간단하다는 것을 발견했습니다. 그런 다음 뷰 계층 구조를 조정하여 uinavigationbar를 추가하고 Self를 다시 반환합니다. 그러나 어쨌든 설정은 종종 해당 한 메소드로 격리되어 발신자가 각 경우에 동일하게 처리합니다.

Apple은 연락처 응용 프로그램이 어떻게 작동하는지 설명합니다.

사용자 정의 뷰 컨트롤러 클래스를 사용하여 컨텐츠를 표시하고 편집하는 데 사용하려면 setEditing:animated: 방법.

예를 들어 무료로 기능을 얻을 수 있습니다 Edit/Done 단추.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top