2012-12-31 5 views
2

내 데이터 모델에 엔터티를 추가하는 사용자 지정 URL 스키마를 구현 중입니다. 엔티티에 대한 세부 정보는 URL에 포함됩니다. 기본 아이디어는 이메일 링크 (또는 다른 앱의 링크)가 내 앱을 열고 새 항목을 추가한다는 것입니다.현재 뷰 상태를 모른 채 openURL 구현

문제는 응답 할 때 내 앱이 어느 상태에 있는지 확신 할 수 없다는 것입니다. 뷰 컨트롤러의 수에는 제한이 없습니다. 엔터티 목록이 표시되면 해당 엔터티에 대한 새 행을 삽입해야합니다. 화면에 다른보기가 있으면 다른 방식으로 반응해야합니다. 일부보기는 모달이 될 수도 있습니다.

나는이 일이 발생했을 때 간단한 패턴으로 만족할 것입니다. 사용자가 현재하고있는 일을 중단하고 루트보기 컨트롤러에 팝업합니다. 여기에서 컨트롤러에 추가 할 새로운 엔티티를 보여줄 것입니다.

나는 항상 정확하게 표시되는 것을 알 필요하지 않는 장점과 함께, 모든 모달 표시 기각 루트에 터지는 실험이 잘 합리적으로 작동

[(UINavigationController *)self.window.rootViewController dismissViewControllerAnimated:NO completion:nil]; 
[(UINavigationController *)self.window.rootViewController popToRootViewControllerAnimated:NO]; 

하지만, 거기에 적어도 두 사례 그것은 불충분 여기서

  1. 모달 제시되었을 때 어떤 객체 (모달 다음 새 개체를 수정하는 데 사용), 사용자가 취소 경우 개체를 삭제할 수있는 대리인의 책임이며, 생성 된 경우 엔티티는 계속 살아있을 것입니다.
  2. UIActionSheet이 표시되면 모든 베팅이 해제됩니다. 컨트롤러를 표시 한 컨트롤러를 알지 못하고 해당 컨트롤러에 액세스 할 수없고 작업 시트를 닫는 메시지를 보내지 않으면이를 닫을 수 없습니다. 이렇게하지 않으면 루트보기 컨트롤러가 표시되지만 액션 시트가 화면에 그대로 유지됩니다. 액션 시트의 후속 탭은 충돌을 일으켰습니다. 컨트롤러를 표시 한 컨트롤러가 없어 졌기 때문입니다.

어떻게 처리할까요? 현재 어떤 뷰 컨트롤러가 제공되고 있는지, 그리고 각 시나리오를 차례로 처리하려고하는지 알아야합니까? 아니면 컨트롤러를 추가하거나 응용 프로그램의 흐름을 변경할 때마다 업데이트 할 필요가없는 확장 가능한 솔루션이 있습니까? 여러 일을하려고하는 것처럼

답변

3

소리가 난다 :

  1. 사용자 정의 URL을 사용자가 클릭, 당신은 당신의 모델에 "실체"를 추가 할 때.
  2. EntityListViewController 일종의이 새로운 엔티티를 표시하려면 ViewController 스택에 있거나 없을 수 있습니다.
  3. EntityListViewController 위의 모든보기 컨트롤러가 튀어 나오길 원할 수도 있습니다.
  4. 사용자는 새로운 항목이 추가되었음을 알기를 원합니다 (아마도 항목 2를 수행하는 것만으로).
  5. EntityViewController을 누르거나 현재보기 컨트롤러 스택에 EntityViewController이있는 경우 새 엔터티의 데이터를 다시로드하려고합니다.

URL 클릭을 처리하고 새 모델 개체를 삽입하는 것에 대해 명시 적으로 묻지 않았기 때문에 항목 1을 사용할 준비가 된 것 같습니다.

나머지는 유연하고 MVC-ish 패턴은 NSNotificationCenter를 사용하는 것입니다.

새로운 모델 객체를 삽입하는 코드 것 "후"알림 : 그런 다음 다양한 UI 요소 (예를 들어, UIAlertView와의 UIViewController 서브 클래스)

[[NSNotifcationCenter defaultCenter] postNotificationName:@"entity_added" object:myNewEntity]; 

이 알림을 수신하고 (유용한 조치를 취할 것 EntityListViewController 또는 EntityViewController의 경우 자신을 다시로드하는 것처럼).

예를 들어, UIViewController 서브 클래스는이 작업을 수행 할 수 있습니다

-(void) viewDidLoad 
{ 
    [super viewDidLoad]; 
    [[NSNoticationCenter defaultCenter] addObserver:self selector:@selector(onNewEntity:) name:@"entity_added" object:nil]; 


-(void) onNewEntity:(MyEntity*)entity 
{ 
    // close, or redraw or... 
} 

-(void) dealloc 
{ 
    [[NSNoticationCenter defaultCenter] removeObserver:self]; 
    // if not using ARC, also call [super dealloc]; 
} 

, 나는 통지가 발생했을 때이 일을 고려할 것 (모든 다른 UI 상태에 대한 걱정을 너무 많이하지) 간단한 생활을 유지하려면 :

  1. EntityListViewController은 그 자체로 다시 그려야합니다 (위에 무언가가 있어도 상관 없습니다).
  2. 내비게이션 막대 (또는 항상 볼 수있는 다른 곳)에 일시적인 표시기를 표시하거나 사용자가 엔티티가 추가되었음을 알 수 있도록 소리를 재생합니다.
  3. 그게 전부입니다.

이 방법을 사용하면 사용자가 수행하는 작업에 최소한의 영향을 미치지 만, EntityListViewController으로 다시 돌아 가면 이미 표시된 모든 새 엔터티가 있습니다.

분명히 맞춤 URL을 클릭하면 기존 엔티티가 삭제 될 수있는 경우 해당 엔티티와 관련된 모든보기 컨트롤러를 삭제하는 것이 더 중요합니다. 그러나 이것은 또한 당신이 동일한 패턴을 사용하여 할 수있는 것입니다 - 모델이나 컨트롤러가 알림을 게시하게하고 다양한 UI 요소가이를 듣고 적절한 조치를 취하게하십시오.

+0

위대한 제안에 감사드립니다. 나는이 길로 내려갈 수 있습니다. 이상적이지는 않습니다. 기술적 제한을 수용하기 위해 원하는 UI 동작을 절곡하고 있습니다.하지만 실용적인 것처럼 보입니다. 또한 합리적으로 확장 할 수 있지만 필요한 경우 새 컨트롤러를 추가하여 알림을 수신해야한다는 점을 기억해야합니다. 나는 당신이 제안한 것을 구현하고 그것이 어떻게 진행되는지 보도록 노력할 것입니다. 여전히 어리석은 방법에 관심이있을 것입니다. 시작 화면으로 돌아가서 내 앱을 걷어차 고, 내가 좋아하는 일을 어디서든 할 수 있습니다. –

+1

중간 측정 값은'popToRootViewController'에있을 수 있습니다 만, 그렇게하기 전에 당신이 그렇게 할 것이라는 알림을 내 보냅니다. 그런 다음 취소 될 때 객체를 삭제해야하는 viewcontroller 나'UIActionSheet'의 하위 클래스와 같이 언급 한 몇 안되는 "특별한"장소에서 알림을 청취하기 만하면됩니다. – Morgan

+1

나는 대개'UIActionSheet'와'UIAlertView'를 하위 클래스로 만들었습니다. 이렇게하는 것도 좋은 이유 중 하나입니다. 이러한 하위 클래스에서 관찰자를 추가하는 좋은 곳은 initBlah이며 dealloc에서 관찰자를 제거합니다. – Morgan

관련 문제