iOS 8에서 작동하지 않는 Segue 해제
iOS 7에서 잘 작동하는 앱이 iOS 8 용으로 빌드 된 경우 풀기 segues가 작동하지 않습니다.
새 프로젝트를 만들고 모달 (tableviewcontroller가있는 내비게이션 컨트롤러)을 추가하고 풀기 모달을 사용했습니다. 불행히도 작동하지 않습니다. 해제되는 방법은 대상 뷰 컨트롤러에 있습니다. unwind segue는 스토리 보드 (tableviewcontroller의 탐색 바 버튼)를 통해 생성됩니다. 버튼을 탭해도 아무 일도 일어나지 발음합니다. 로그 출력이없고 모달이 사라지지 언어. 또한 모달 세그에만 영향을 미칠 것입니다. 밀기 / 팝 오버가 곧 풀립니다.
누구든지 어떤 문제가 어떤 방법으로 아이디어가 있습니까?
Apple은 iOS 8.1에서 버그를 수정했습니다.
iOS 8.0 용 임시 솔루션
unwind segue는 다음 상황에서만 작동하지 않습니다.
보기 구조 : UITabBarController- > UINagivationController- > UIViewController1- > UIViewController2
일반적으로, (아이폰 OS 7, 8.1 년) 때부터 언 와인드 UIViewController2 에 UIViewController1 , 그것은 viewControllerForUnwindSegueAction 에 UIViewController1 을 호출 합니다.
그러나 iOS 8.0 및 8.0.x에서는 UIViewController1 대신 UITabBarController 에서 viewControllerForUnwindSegueAction 을 호출하면 unwind segue가 더 이상 작동하지 않습니다.
해결 방법 : 대체 viewControllerForUnwindSegueAction 에서 UITabBarController가 사용자 정의 작성하여 UITabBarController가 사용자 정의를 사용합니다.
스위프트 용
CustomTabBarController.swift
import UIKit
class CustomTabBarController: UITabBarController {
override func viewControllerForUnwindSegueAction(action: Selector, fromViewController: UIViewController, withSender sender: AnyObject?) -> UIViewController? {
var resultVC = self.selectedViewController?.viewControllerForUnwindSegueAction(action, fromViewController: fromViewController, withSender: sender)
return resultVC
}
}
구식 Objective-C 용
CustomTabBarController.h
#import <UIKit/UIKit.h>
@interface CustomTabBarController : UITabBarController
@end
CustomTabBarController.m
#import "CustomTabBarController.h"
@interface CustomTabBarController ()
@end
@implementation CustomTabBarController
-(UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
{
return [self.selectedViewController viewControllerForUnwindSegueAction:action fromViewController:fromViewController withSender:sender];
}
@end
================================================ ==========================
이 지점 아래의 어떤 솔루션도 사용하지 않고 (오래된 사용 참조 용입니다).
9 월 23 일의 최신 업데이트
내 새로운 솔루션은 내비게이션 컨트롤러에 내장 된 뷰로 푸시하고 해당 내비게이션 컨트롤러를 구성하여 푸시 (IB의 체크 박스)에 하단 막대를 숨 깁니다. 그런 다음 모달 뷰처럼 보이는 뷰를 몇 가지 될 것입니다. 유일한 차이점은 밀고 터뜨리는 애니메이션입니다. 원하는 경우 사용자 정의가 가능합니다.
업데이트 됨 : 아래 솔루션은 실제로 탭 표시 줄 아래 에 모달보기 를 표시 할 때 추가보기 레이아웃 문제가 발생합니다.
에 SEGUE 유형 변경 선물로 팝 오버를 에서만 작동합니다 iOS8의 를 위해 아이폰 , iOS7에 앱 충돌합니다 .
이 문제를 해결하기 segue의 프레젠테이션을 현재 위해로 설정했습니다 (내 앱은 iphone 전용입니다).
기본 및 전체 화면이 작동하지 않습니다.
[ 업데이트 :. 아이폰 OS 8.1 베타에서 버그가 수정되었지만 8.0 및 8.0.2 지원을 위해 필요합니다]
내가 긴장을 풀 수있는 유일한 방법은 Aditya와 viirus의 대답을 혼합하는 방법은.
내 설정 : [View Controller 1]> custom modal segue> [Navigation Controller]> root> [View Controller 2]
Unwind : [View Controller 2]> custom unwind segue> [View Controller 1]
수정 : [Navigation Controller] 하위 클래스, sourceViewController라는 속성을 추가하고 [View Controller 1]에서 [Navigation Controller]로 실행할 때 segue 준비가 호출되면 해당 속성에 "self"를 전달합니다.
[Navigation Controller] 하위 클래스 .m에서 다음 두 메소드를 재정의 / 추가합니다.
- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
{
if ([self.sourceViewController canPerformUnwindSegueAction:action fromViewController:fromViewController withSender:sender]) {
return self.sourceViewController;
}
return [super viewControllerForUnwindSegueAction:action fromViewController:fromViewController withSender:sender];
}
그런 다음 사용자 지정 해제 segue가 있기 때문에 [Navigation Controller] 하위 클래스에서만 재정의합니다.
- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier {
return [fromViewController segueForUnwindingToViewController:toViewController
fromViewController:fromViewController
identifier:identifier];
}
이 iOS 8.0, 8.0.1 및 8.0.2의 문제입니다. 8.1에서 해결되었습니다. segues는 이제 적절한 메소드를 호출하고 있습니다.
iOS 8에서는 iOS 7과 달리, 해제 세션을 수행 할 때 모달로 제시된 뷰 컨트롤러가 자동으로 해제되지 않을 수 있습니다. 항상 해제되도록하려면 해제되었는지 감지 한 다음 수동으로 해제하지 않을 경우이를 감지 할 수 있습니다. 이러한 불일치는 iOS 9.0에서 해결되었습니다.
iPhone에서 실행되는 iOS 8.4에서는 전체 화면 및 현재 컨텍스트를 제외한 모든 프레젠테이션 스타일이있는 모달로 표시된 모든 segues가 해제시 해제됩니다. 양식 시트와 페이지 시트를 추가하면 자동으로 닫히지 않는 iPad의 경우도 마찬가지입니다. iOS 9에서는 iPhone과 iPad에서 모든 프레젠테이션 스타일이 자동으로 해제됩니다.
네, 나에게도 발생합니다. 귀하의 경우 UINavigationController를 하위 클래스로 만들고 다음을 재정의해야한다고 생각합니다.
- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
{
for(UIViewController *vc in self.viewControllers){
// Always use -canPerformUnwindSegueAction:fromViewController:withSender:
// to determine if a view controller wants to handle an unwind action.
if ([vc canPerformUnwindSegueAction:action fromViewController:fromViewController withSender:sender])
return vc;
}
return [super viewControllerForUnwindSegueAction:action fromViewController:fromViewController withSender:sender];
}
여기에도 같은 문제가 있습니다. Unwind 메서드가 호출되지 않습니다. 경우에만 발생
- 모달 segue 사용
- 프레젠테이션은 "현재 컨텍스트"가 아닙니다.
- NavigationController가 확장되지 않았습니다 (스토리 보드의 기본값 사용).
IOS8 GM Seed에서도 발생하므로 해결 방법을 찾아야한다고 생각합니다. 나에게 버그처럼 들린다 ...
UINavigationController 확장 및 viewControllerForUnwindSegueAction 구현은 실행되지 않았으므로 도움이되지 않았습니다. 해고되는 유일한 것은 확장 된 UINavigationController 내의 canPerformUnwindSegueAction ()입니다. 이상한.
와우! iOS 8.1.1 (iPad 3에서)의 모달보기에서 멈춘다는 사용자 보고서가 계속 표시됩니다.
모달 뷰에서이 모든 풀림을 버리고 있습니다. 그냥 좋은 구식 ...
[self dismissViewControllerAnimated:NO completion:nil];
... 모든 다양한 iOS 8.xx 버전에서 잘 작동합니다.
iOS 7.1과 iOS 8.1 / 8.2 모두 내비게이션 컨트롤러에서 unwind segue를 생성하는 것 같지만 unwind segue는 내비게이션 컨트롤러 내부의 자식 컨트롤러에 등록되어 있습니다.
따라서 스토리 보드에 등록 된 컨트롤러에서 해제 segue를 수동으로 생성하면 문제가 해결됩니다.
@implementation RootNavigationController
- (UIStoryboardSegue*)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier {
return [toViewController segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier];
}
@end
대상 뷰 컨트롤러에서 소스 뷰 컨트롤러로 풀 때 동일한 문제가 발생했습니다. 목적지는 소스에서 "쇼"segue를 통해 제시되었습니다. iPhone 6, iOS8.3을 보여주는 iPhone 시뮬레이터를 사용하고있었습니다. XCode 6.3.2
NavigationViewController를 서브 클래 싱하는 솔루션이 저에게 효과적이었습니다. 다음은 Raul의 대답을 근본적으로 신속하게 번역하는 신속한 코드입니다. Apple이 Raul에 따라 iOS8.1에서 수정했다면 8.3에서 어떻게 타격을 입을까요?
var sourceViewController: UIViewController?
override func viewControllerForUnwindSegueAction(action: Selector, fromViewController: UIViewController, withSender sender: AnyObject?) -> UIViewController? {
if(self.sourceViewController! .canPerformUnwindSegueAction(action, fromViewController: fromViewController, withSender: sender!)){
return self.sourceViewController
}
return super.viewControllerForUnwindSegueAction(action, fromViewController: fromViewController, withSender: sender)
}
방금이 문제에 부딪 혔고 일부 파헤쳐 서 모달 segue (기본 및 전체 화면 프레젠테이션 모드가있는 하나)를 사용하면 일반적인 해제 일부에 의존 할 수 없지만 제시된 UIViewController의 dismissViewControllerAnimated를 호출해야합니다. 방법.
따라야 할 단계 :
- 풀기 segue를 Storyboard의 버튼에 연결합니다.
버튼에 대한 IBAction을 만들고 그 안에 코드를 추가합니다.
[self dismissViewControllerAnimated:NO completion:nil];
이 모든 버전에서 작동합니다.
참고 URL : https://stackoverflow.com/questions/25654941/unwind-segue-not-working-in-ios-8
'ProgramingTip' 카테고리의 다른 글
읽어야하는 PEP는 무엇입니까? (0) | 2020.11.15 |
---|---|
C #에서 개체의 메모리 주소 (0) | 2020.11.15 |
reCAPTCHA CAPTCHA가 점점 어려워 지나요 아니면 나만 (0) | 2020.11.15 |
C ++ : 함수 / 메소드 선언에서 앰퍼샌드 "&"와 별표 "*"의 차이점은 무엇입니까? (0) | 2020.11.15 |
배포를 처리하기 위해 pip, virtualenv 및 Fabric을 어떻게 사용합니까? (0) | 2020.11.15 |