사용자가 uinavigationcontroller에서 뒤로 버튼을 눌렀는지 확인 하시겠습니까?
뷰가로드 될 때 사용자가 뒤로 버튼을 눌렀 기 때문인지 확인하고 싶습니다. 어떻게 확인할 수 있습니까?
이 작업을 수행하는 유일한 방법은 사용자 정의 버튼을 만드는 것입니다. 방법을 모르는 경우이 튜토리얼을 확인하십시오 . 일반 뒤로 버튼과 똑같이 보이지는 않지만 닫힙니다. 도움이 더 필요하면 댓글을 게시하세요.
UINavigationController의 뒤로 버튼 누름 (iOS 5.0 이전)을 감지하는 가장 좋은 솔루션은 현재보기 컨트롤러가 탐색 컨트롤러의보기 컨트롤러 스택에 없는지 확인하는 것입니다.
이 조건 - (void)viewDidDisappear:(BOOL)animated
을 논리적으로 확인하는 것이 더 안전 할 수 있습니다. 메서드가 호출 될 때 뷰 컨트롤러가 스택에서 제거되었을 가능성이 매우 높습니다.
iOS 5.0 이전 :
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
if (![[self.navigationController viewControllers] containsObject:self]) {
// We were removed from the navigation controller's view controller stack
// thus, we can infer that the back button was pressed
}
}
iOS 5.0 이상에서는 -didMoveToParentViewController 를 사용할 수 있습니다 .
- (void)didMoveToParentViewController:(UIViewController *)parent
{
// parent is nil if this view controller was removed
}
viewWillDisappear 메서드 확인에서
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
if ([self isMovingFromParentViewController]) {
//specific stuff for being popped off stack
}
}
이것은 iOS 5 이후에만 해당됩니다.
UINavigationController에는 delegate
델리게이트 콜백을 발행 하는 속성이 있습니다. 참조하시기 바랍니다 아이폰 OS가 여기 참조 .
델리게이트에는 "뒤로 버튼 누름"콜백이 없지만 대신 탐색 스택에 무언가가 나타날 때 알려줍니다. 뒤로 누르면 상위 뷰 컨트롤러가 스택에서 "팝핑"되므로 뷰가 곧 나타날 것입니다. 나는 이것이 당신이 찾고있는 콜백이라고 생각합니다.
"관심있는"뷰 컨트롤러인지 확인하는 간단한 논리를 사용하여 알림 등을 보낼 수 있습니다.
완전성을 위해 Swift에서 가장 많이 찬성 된 두 답변 ( 1 , 2 )을 혼합합니다 .
override func willMoveToParentViewController(parent: UIViewController?) {
super.willMoveToParentViewController(parent)
if parent == nil {
// view controller is popping
}
}
이것은 약간 다른 시나리오이지만 솔루션이 다른 사람들에게 도움이 될 것이라고 생각했습니다.
제 상황에서는 UIPopoverController 내에 UINavigationController가 있습니다. 사용자가 뒤로 버튼을 클릭했는지 아니면 팝 오버 외부를 클릭했는지 감지해야했습니다. 이를 위해 viewWillDisappear에서 visibleViewController 속성을 확인했습니다. 닫을 때 뷰 컨트롤러가 여전히 visibleViewController이면 팝 오버가 다른 방법으로 닫힙니다. 닫을 때 뷰 컨트롤러가 visibleViewController가 아니면 뒤로 버튼을 눌렀습니다.
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
if (self.navigationController.visibleViewController != self) {
<Do something since we're closing using something else>
} else {
<Do something since we're closing because of the back button>
}
}
I tried using zach's solution, but isMovingFromParentViewController returns true for both cases.
I verified this works in iOS 5+
I hope this helps.
Create a custom back bar button and set the target,
Step 1: Add these methods to your class
- (void)backButtonClicked :(id)sender{
[self.navigationController popViewControllerAnimated:YES];
}
- (void)addBackBarButton{
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0, 0, 55, 35);
[button setTitle:@"back" forState:UIControlStateNormal];
[button addTarget:self action:@selector(backButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button];
self.navigationItem.leftBarButtonItem = customBarItem;
}
Step 2: Call [self addBackBarButton]; in viewDiDLoad method
You will get the action in backButtonClicked method. You can play around with it the way you want.
Cheers!
'Programing' 카테고리의 다른 글
CSS 삽입 테두리 (0) | 2020.11.26 |
---|---|
TortoiseSVN이 인증 세부 정보를 저장하지 않음 (0) | 2020.11.26 |
동적 생성 레이아웃의 ID를 설정하는 방법은 무엇입니까? (0) | 2020.11.26 |
ASP.NET MVC 1.0 AfterBuilding 뷰가 TFS 빌드에서 실패 함 (0) | 2020.11.26 |
양식 제출을 클릭하면 Google Analytics에서 이벤트 추적 (0) | 2020.11.26 |