2009-12-15 3 views
3

내 iPhone 애플리케이션에는 내비게이션 컨트롤러, 기본 화면 및 일부 편집 화면이 있습니다. 편집 화면에서 사용자는 유효성을 검사해야 저장 할 수 있습니다. 이상적으로 "Done"버튼을 누르지 않고도 다시 내비게이션에서 데이터를 자동으로 업데이트하고 싶습니다. 내비게이션을 중지하고 문제가있는 경우 오류 메시지를 표시 할 수있는 방식으로 다시 탐색 (예 : 사용자가 표준 뒤로 버튼을 탭할 때)에서 유효성 검사 및 저장을 수행 할 수 있습니까?iPhone : 내비게이션의 유효성 검사를 통해 저장

나는 여러 가지 다른 가능성을 참조하십시오

  • 내 사용자 지정 왼쪽 버튼을 만들고이를 표준 다시처럼 보이는합니다.
  • 추가 (왜 애플은? 공용 API에이 버튼 스타일을 넣어하지 않았다) "완료"버튼을 사용자가 그것에게

도청하지만 모두 이러한 선택은 내가 훨씬 적은을 좋아하는 경우에만 데이터를 저장합니다. 그래서 내가 원하는 것을 성취 할 수있는 방법이 있다면 그것을 사용하고 싶습니다.

답변

3

기본적으로 루트보기 컨트롤러의 backBarButton에서 동작을 무시하고 거기에서 유효성 검사를 수행하고 싶습니다. 유효성 검사가 성공하면 UINavigationControllerpopViewControllerAnimated:으로 전화하고, 그렇지 않으면 오류 경고 또는 기타를 표시합니다.

그러나 루트보기 컨트롤러 navigationItem.backBarButton에 대한 targetaction 속성을 설정하려고하면 작동하지 않습니다. 분명히 이것들은 무조건해야합니다.

표준 백 바 버튼을 맞춤 버튼으로 교체하는 방법입니다. 당신은 표준 UIBarButtonItem으로 그 일을 할 수 있습니다, 그러나 이것이 스타일 중 하나로 이용 가능하지 않기 때문에 당신은 '화살'모양을 잃을 것입니다. 단추에 대한 사용자 지정보기를 사용하는 것이 좋습니다. 그 예를 보려면 this thread을 확인하십시오.

+0

이것은 선택 1과 같은 의미 였지만 가능하다면 기본 룩앤필을 시뮬레이트하고 싶지 않습니다. – SergGr

0

UIViewController 하위 클래스의 [popViewControllerAnimated :]를 그냥 재정의하십시오. 그렇게하면 화면을 떠나는 뷰 컨트롤러의보다 일반적인 시나리오를 다룰 수 있습니다.

+0

그럴 수 없다 : popViewControllerAnimated는 UIViewController가 아니라 UINavigationController에서 온다. 그는 이것에 대해서만 UINavigationController의 특정 하위 클래스를 만들어야한다. –

0

내가 "뒤로 버튼을 누를 때이를 감지"발견하는 가장 좋은 방법은과 같이 viewWillDisappear을 재정의하는 것입니다

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    if (!isPushing) { 
     // Apply your changes here 
    } 
} 

부울 isPushing는 자신을 정의하는 하나가 될 것입니다, 당신은 참으로 설정 다른 컨트롤러를 자신이 직접 푸시하는 장소에서만 ... (사용자가 ...하는 경우) viewWillDisappear을 호출 할 수 있습니다. 왜냐하면 뒤로 버튼을 눌렀 기 때문에 대 신 컨트롤러를 직접 푸시하기 때문입니다.

당신은 보통과 같이 테이블 컨트롤러에서 다른 컨트롤러 자신을 밀어 :

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Example of pushing a new controller onto the navigation stack yourself... 
    isPushing = YES; // You have to set that boolean here... 
    [self.navigationController pushViewController:myNewController animated:YES]; 
} 
+0

나는 내가 그 사건을 가로 챌 수 있다는 것을 안다. 나는이 순간에 네비게이션을 멈출 방법을 보지 못한다. 그리고 탐색을 멈출 수 없다면 입력 유효성 검사가 실패 할 경우 합리적인 조치를 취할 수 없습니다. – SergGr

0

또 다른 방법을 말하자면, 사용자가 jQuery과의 한 행을 도청은 탭 뷰 컨트롤러를 시작해야하는 것, 경우 팝.

0

또 다른 방법은 상위 뷰에서 작업을 수행하는 것입니다.

데이터보기 (예 : 연락처 정보)에서 필드 편집보기 (예 : 이름 편집)로 이동한다고 가정 해 보겠습니다. 수정보기를 시작하기 전에 데이터보기에는이 사실에 대한 정보가 저장됩니다 (예 ::

에서 다음
self.navigatingTo = NavigatingToNameEdit; 

데이터 뷰의 viewWillAppear, 그 확인하고 편집보기에서 관련 정보를 추출 :

if (self.navigatingTo == NavigatingToNameEdit) { 
    self.name = self.nameEditView.name; 
    // Don't forget to reset navigatingTo: 
    self.navigatingTo = NavigatingToNone; 
} 
0

당신은 아마 얼마 전에이에서에 이동 한 동안, 나는 단지를 오늘이 문제에 부딪혔다. 제 추측으로는 애플이 당신이 그 뒤로 버튼의 동작을 무시하기를 원하지 않는다는 것입니다. 내 솔루션은보기 컨트롤러 (보기로 방금 이동 한)에 표시하고 경고하고 AlertViews 대리자 메서드 "clickedButtonAtIndex"를 사용하여 오류가있는 화면으로 사용자를 다시 이동시키는 것이 었습니다. 전반적으로 나는 그것이 꽤 깨끗한 것을 가로 질러 온다고 생각한다. 내 2 센트 ...

관련 문제