스토리 보드 Xcode 6의 Adaptive segue 6 푸시가 더 이상 사용되지 않습니까?


121

기본적으로 Xcode 6 인터페이스 빌더에는 "크기 클래스 사용"확인란이 새로 추가되었습니다. 뷰를 적응력있게 만듭니다. 여기에 이미지 설명 입력

스토리 보드에서 두 가지보기 사이를 구분하려고 할 때 새로운 옵션이 있습니다. 여기에 이미지 설명 입력

대신 오래된 :

여기에 이미지 설명 입력

이제 "push"및 "modal"대신 "show"및 "present modally"가 있습니다. 이전 옵션은 더 이상 사용되지 않는 것으로 표시됩니다. "show"옵션을 선택했습니다. segue 설정에서 "show (예 : push)"라고 불렸 기 때문입니다.

여기에 이미지 설명 입력

그러나 그것은 밀어 붙이지 않습니다. Segue 애니메이션은 하단 (모달)에서 슬라이드처럼 보이고 탐색 모음이 사라집니다.

질문은 "쇼"가 푸시처럼 작동하도록하려면 어떻게해야합니까? 가능합니까 아니면 대신 "푸시 (사용되지 않음)"를 사용해야합니까? 새로운 유형의 segue에 대한 정보는 어디에서 찾을 수 있습니까? 내가 iOS8 개발자 라이브러리에서 찾은 유일한 것은 Storyboards Help You Design Your User Interface 이지만 "show"segue에 대한 정보는 없습니다.

최신 정보

새 프로젝트를 만들려고했는데 "show"가 정말 "push"처럼 작동합니다. 내 프로젝트의 문제는 이와 같은 코드로 탐색 컨트롤러를 재사용하기 때문에 발생할 수 있다고 생각하지만 해결 방법을 모르겠습니다.

if ( [segue isKindOfClass: [SWRevealViewControllerSegue class]] ) {
    SWRevealViewControllerSegue *swSegue = (SWRevealViewControllerSegue*) segue;
    
    swSegue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc) {
        
        UINavigationController* navController = (UINavigationController*)self.revealViewController.frontViewController;
        [navController setViewControllers: @[dvc] animated: NO ];
        [self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES];
    };
    
}

그 후 MainViewController 후에 NewViewController를 푸시하려고합니다. 여기에 이미지 설명 입력

업데이트 2 :

iOS 7, iOS 7.1 문제인 것 같습니다.

답변:


97

예, '푸시'대신 '표시'를 사용합니다.

"쇼"가 푸시처럼 작동하도록하려면 어떻게해야합니까? 가능합니까 아니면 대신 "푸시 (사용되지 않음)"를 사용해야합니까?

해야합니다. 그것은 나를 위해합니다. 저는 Xcode 6 베타 2를 사용하고 있으며 테스트를 위해 단일 뷰 템플릿을 사용했습니다 (IB 'VC_A'에서 미리 만들어진 뷰 컨트롤러 호출). 그런 다음 다른 뷰 컨트롤러 ( 'VC_B')를 추가했습니다. 그런 다음 VC_A에 버튼을 추가하여 VC_B와 VC_B의 다른 버튼을 VC_A에 다시 표시했습니다. 스토리 보드에 내비게이션 컨트롤러를 초기 뷰 컨트롤러로 추가하고 VC_A를 rootViewController로 만들면 'push'와 'show'가 같은 효과를 갖습니다. 초기 내비게이션 컨트롤러가없고 'show'를 사용하면 VC_B가 아래에서 위로 슬라이드한다는 설명을들을 수 있습니다. '푸시'하려고하면 내비게이션 컨트롤러가 있어야하기 때문에 충돌이 발생합니다.

새로운 유형의 segue에 대한 정보는 어디에서 찾을 수 있습니까?

그래서 여기 '인터페이스 빌더의 새로운 기능'세션에서 몇 가지 정보를 찾았 습니다 . 슬라이드를 보면 하나의 슬라이드 (41)가 변경 사항을 언급하는 것을 볼 수 있습니다. 세션 비디오를 볼 때 38:00 분으로 건너 뛰어 적응 형 세그먼트에 대해 이야기 할 수 있습니다. 예를 들어 'show'적응 형 segue는 새로운 뷰 컨트롤러의 프레젠테이션을 수행하는 방법을 결정할 때 컨텍스트를 고려한다고 설명합니다.


답변 주셔서 감사합니다. 새 프로젝트를 만들려고했는데 "show"는 정말 내비게이션 컨트롤러로 푸시하는 것과 같습니다. 내 프로젝트에서는이 강의 appcoda.com/ios-programming-sidebar-navigation-menu 및 푸시 작업 의 사이드 바와 함께 복잡한 구조를 가지고 있지만 쇼는 그렇지 않습니다. 그 이유는 탐색 컨트롤러를 재사용하기 때문일 수 있습니다. 재사용 코드로 질문을 업데이트했습니다.
John Kakon 2014-06-19

따라서 업데이트를 볼 때 가장 먼저 보게되는 것은 사용자 정의 segue : 'SWRevealViewControllerSegue'를 사용하고 있다는 것입니다. 그래서 네 경우에 'show'또는 'push'를 사용하는 것이 이치에 맞지 않을 것입니다. 사용자 지정 코드를 실행하려는 동안 segues. 샘플 프로젝트를 다운로드하면 스토리 보드 파일의 segues에서 'custom'선택 항목까지 표시됩니다.
Spencer Hall

나는이 segue를 의미하지 않았다. "MainViewController"(내비게이션 컨트롤러가 있고 내 "업데이트"는 어떻게 거기에 가져 오는지 보여줍니다) 옆에 새 UIViewController를 만들고 MainViewController에 새 뷰를 푸시하려고합니다. 스토리 보드 스크린 샷 샘플 프로젝트에서 "크기 클래스 사용"을 활성화하고 NewViewController를 만들고 "show"를 통해 MainViewController와 NewViewController 사이에서 segue를 만들어 주시면 감사하겠습니다. 내가 무슨 말을하는지 알게 될 것입니다.
존 Kakon

지금 막 그랬고 적어도 저에게는 "쇼"가 "푸시"처럼 작동했습니다.
Spencer Hall

9
뷰 컨트롤러의 모든 방법에 루트에 UINavigationController가 있는지 확인하여 버그를 해결할 수 있습니다. 그것이 결코 액세스되지 않는 스토리 보드에 UINavigationController를 넣는 것을 의미하더라도. 배선이 동작을 추론하는 데 사용되는 것 같습니다.
스콧 로버트슨

33

이미 받아 들여진 답변이 있지만 이전에 사용할 수 없었던 정보를 조금 더 제공하고 싶었습니다.

앞서 언급했듯이 "push"및 "modal"segues는 더 이상 사용되지 않으며 각각 "show"및 "present modally"로 대체되었습니다. Apple의 문서에 따르면 새로운 segues는 크기 등급에 적응하는 segues로 더 나뉩니다. 이전 버전은 iOS 8 이전의 iOS 버전을 지원하는 데만 사용해야합니다.

다음 링크의 문서는 사용 가능한 모든 segues, old 및 new에 대한 설명을 설명합니다.

스토리 보드에서 장면 사이에 Segue 추가

향후 URL이 변경되는 경우, 다음은 각각의 새 세그에 대한 설명입니다.

보여 주다

화면의 내용에 따라 상세 또는 마스터 영역에 내용을 표시합니다. 앱이 마스터 및 상세보기를 표시하는 경우 콘텐츠가 상세 영역으로 푸시됩니다. 앱이 마스터 또는 세부 정보 만 표시하는 경우 콘텐츠는 현재 뷰 컨트롤러 스택의 맨 위에 푸시됩니다.

세부 사항보기

세부 정보 영역에 콘텐츠를 표시합니다. 앱이 마스터 및 세부 정보보기를 표시하는 경우 새 콘텐츠가 현재 세부 정보를 대체합니다. 앱이 마스터 또는 세부 정보 만 표시하는 경우 콘텐츠가 현재 뷰 컨트롤러 스택의 맨 위를 대체합니다.

모달로 제시

내용을 모달로 제시하십시오. 프레젠테이션 스타일 (UIModalPresentationStyle) 및 전환 스타일 (UIModalTransitionStyle)을 선택하는 옵션이 있습니다.

Popover로 표시

콘텐츠를 기존보기에 고정 된 팝 오버로 표시합니다. 팝 오버보기의 한쪽 가장자리에 표시되는 화살표의 가능한 방향을 지정하는 옵션이 있습니다 (UIPopoverArrowDirection). 앵커보기를 지정하는 옵션도 있습니다.


24

tldr; 올바르게 푸시되지 않는 Segue를 삭제하고 UIView / UIControl에서 대상 뷰 컨트롤러로 드래그하여 스토리 보드에서 다시 만듭니다.

다른 답변에는 아무런 문제가 없지만이 답변은 무슨 일이 일어나고 있는지, 어떻게 확인하고 향후 문제를 완화하는 방법을 설명합니다.

배경

제 경우에는 초기 뷰 컨트롤러로 UINavigationController가 이미 있었음에도 불구하고 내 Show Segues가 작동하지 않았습니다 (내 콘텐츠 UIViewController가 루트 인 경우).

쇼 Segue가 중단되는 이유와 방법

Show segue는 스토리 보드의 소스 xml 내에서 segue와 관련된 작업이있을 때 중단됩니다. 이를 유발하는 일반적인 시나리오는 이전에 코드에서 호출 된 수동 segue에서 segue를 재정의 한 경우 일 수 있습니다. 이것은 스토리 보드 xml에 다음 비트를 남깁니다.

<connections>
    <segue destination="85t-Z1-hxf" kind="show" identifier="ToOptions" action="showDetailViewController:sender:" id="gdZ-IX-KcN">
</connections>

Nota Bene 스토리 보드를 xml로 보려면; 스토리 보드 파일을 마우스 오른쪽 버튼으로 클릭하고 다음으로 열기> 소스 코드를 선택합니다 . 되돌리려면 다음으로 열기> Interface Builder-Storyboard를 사용하십시오.

스토리 보드에서 segue를 사용할 때 사용자 지정 작업을 수용하려면 prepareForSegue를 탭하고 대상 뷰 컨트롤러를 가로 채서 해당 위치에서 메서드를 호출하면됩니다. 어쨌든이 작은 버그의 부작용 (버그는 segue를 재정의 할 때 xml에서 제대로 설정되지 않았다는 사실입니다. 즉, segue를 UIView에서 작동하는 것으로 변경 한 후에도 동작이 유지된다는 사실입니다. UIControl)을 대상 뷰 컨트롤러).

불행히도 가장 직접적인 해결책은 실패합니다. 따라서 스토리 보드 내에서 작업에 대한 xml 속성을 제거하는 것만으로 는 문제가 해결 되지 않습니다 . 대신 스토리 보드 에서 segue삭제하고 다시 만들어야합니다 .

다시 생성되면 스토리 보드 xml에 더 이상 특정 segue와 관련된 작업이 없으며 쇼가 푸시로 실행됩니다.

올바른 Show Segue에 대한 샘플 XML

  <connections>
    <segue destination="RbV-Au-WV9" kind="show" identifier="ToOptions" id="5dm-os-bcS"/>
  </connections>

완화

재발을 방지하려면 가능하면 prepareForSegue를 사용하여 대상 뷰 컨트롤러를 기반으로 필요한 작업을 추가하여 수동이 아닌 스토리 보드 segue를 고수하면됩니다. 또는 믹스 앤 매치를해야하는 경우에는 Show segues에 스토리 보드 xml에 첨부 된 작업이 없는지 확인하기 위해 예방 조치를 취하십시오. 이전 프로젝트를 다루는 경우 몇 가지 문제를 발견 했으므로 Storyboard 소스 코드에 특별한주의를 기울여야합니다.


3
몇 시간 후, 이것은 아마도 다른 시간을 절약했습니다. 로 열기 스토리 보드 : 여기 위를 기반으로 제안 것입니다 소스 코드 를 검색 종류 = "쇼" 라인이 같은 것을 포함하는 경우와 모양 = 행동 "보낸 사람 : showDetailViewController" , 그렇다면,에서 삭제 모든 행동 = 끝날 때까지 " . 나는 진짜 거대한 스토리 보드를 가지고 있고 영향을받은 속편에는이 동작 매개 변수가 포함되어 있지 않지만 다른 관련없는 라인이 포함되어 있습니다. 일단 동작을 삭제하면 모든 적응 형 속편이 예상대로 다시 작동합니다. t 작동합니다.
마커스

이것은 저도 구했습니다.
Adam Bardon

1
XML에서 작업 속성을 삭제하면 내 친구에게 효과적이었습니다.
Brent Royal-Gordon

뿐만 아니라 저를 저장
지미 조지 토마스

xml 파일에서 action 속성을 삭제하면 작동합니다. 이 게시물 없이는 문제를 발견하지 못했을 것입니다.
krizzzn

20

Scott Robertson여기서 언급 했듯이 이것은 iOS 7의 버그처럼 보입니다.

iOS 8에서는 전환이 런타임시 (올바른 동작) 추론되는 반면 iOS 7에서는 전환이 디자인 타임 (버기 동작)에 유추되는 것으로 보입니다.

가장 간단한 해결 방법은 사용하지 않는 탐색 컨트롤러를 스토리 보드에 추가하고 연결하여 해당 뷰 컨트롤러가이 탐색 컨트롤러의 일부가되도록하는 것입니다. 실제로 내비게이션 컨트롤러를 인스턴스화 할 필요는 없으며, 내비게이션 컨트롤러에 포함되어 있음을 알기 위해 버그가있는 뷰 컨트롤러 만 있으면됩니다.

참고 : 탐색 모음을 시뮬레이션하는 것만으로는 이러한 용도로 충분하지 않습니다. 실제로 푸시 스택에 탐색 컨트롤러가 있어야합니다.

버그를 재현하려면 :

  1. 크기 클래스를 사용하는 새 스토리 보드를 만듭니다.
  2. 두 개의 뷰 컨트롤러를 만듭니다 (탐색 컨트롤러 없음).
  3. 첫 번째보기 컨트롤러가 Show (예 : Push) 를 통해 두 번째보기 컨트롤러를 표시하도록합니다. 가 버튼에 연결된 세그 하도록합니다.
  4. 코드에서 첫 번째보기 컨트롤러를 표시하되 탐색 컨트롤러에 삽입합니다. initWithRootViewController: 메서드 .
  5. iOS 7에서 앱을 실행하십시오.
  6. 푸시를 수행해야하는 버튼을 누릅니다.
  7. iOS 7에서는 푸시 대신 모달 전환이 발생합니다. iOS 8에서는 올바른 푸시 동작을 얻게됩니다.

여기에 이미지 설명 입력

버그를 수정하려면 :

  1. 스토리 보드에 탐색 컨트롤러를 추가하고 첫 번째보기 컨트롤러를 루트보기 컨트롤러로 설정합니다. (참고 : 두 번째를 루트 뷰 컨트롤러로 추가해도이 버그는 수정되지 않습니다.)
  2. 탐색 컨트롤러에 액세스 할 수 없다는 경고를 표시하지 않고 해결 방법으로 만 존재한다는 것을 문서화하려면 정크 식별자를 제공하십시오. (예 :) workaround for show segues in iOS 7.

여기에 이미지 설명 입력

내비게이션 컨트롤러가 두 번째 그림에 추가 된 방법과 들어오는 화살표가 없는지 확인하십시오 (즉, 뷰 컨트롤러 식별자를 사용하는 것 외에 인스턴스화 할 방법이 없음).


1
메신저 루트 NavigationControllers의 ViewController 스택 스와핑 할 때 감사의있는 navigationController과 트릭은 나를 위해 그것을 한
피터 파인트

1
최고의 솔루션. 감사합니다
Илья Голованов 2015 년

13

나는 이것에 늦었지만 내가 배운 것을 나누고 싶었다. 이것은 사실 버그이며 오늘날에도 존재합니다 (2014-12-18).

여기에 대한 기사를 썼습니다 .

쉽게 재현 할 수 있습니다. iOS8에서는 Showsegue 를 호출하기 전에 뷰 컨트롤러를 프로그래밍 방식으로 스택에 푸시하지 않는 한 iOS7.x에서도 잘 작동합니다 .

스토리 보드 연결을 사용하여 스택으로 만 푸시하면 작동합니다. 그러나 분명히 코드를 통해 푸시하면 푸시 navigationController속성 UIViewController이 될 nil것이고 호출 Show할 때 스택을 제어하는 ​​탐색이 없기 때문에 모달이라고 가정합니다.

지금까지의 해결 방법은 코드를 통해 푸시하지 않거나 (실행 가능하지 않음) 현재 사용되지 않는 Push.

레이더를 제출했습니다 (기사 링크). Apple이이 문제를 해결하기를 바라면서 자유롭게 중복 파일을 제출하십시오.


3
이것은 정확히 내 문제였습니다. 감사합니다! 이 경우 더 이상 사용되지 않는 푸시를 사용하는 것이 덜 사악한 솔루션 인 것 같습니다.
Moshe Gottlieb 2014

또 다른 해결 방법은 스토리 보드에 (사용되지 않은) 탐색 컨트롤러를 추가하는 것입니다. stackoverflow.com/questions/24184003/…
Senseful

아니! 여기에서 발생하고 원인은 프로그래밍 방식으로 푸시가 아닙니다. 제 경우에는 Showsegue를 수행 한 다음 두 번째 Showsegue에서 모달로 표시됩니다. Solution?
Frade

@Frade가 재현 가능한 github repo에 연결할 수 있습니까? 어떤 버전의 iOS에서 실행 중입니까?
esttorhe

private project .. ShowiOS 7에서 viewController를 (두 번째) 수행하려고 할 때 발생합니다
Frade

2

Xcode 7 및 iOS 7.1.2의 segues에서 동일한 문제가 발생했습니다. Show segues (iOS 8의 새로운 기능)는 iOS 7의 모달 segues 처럼 작동 하며 Storyboard에서 Xcode로 segue 유형을 정의 할 때 뷰 컨트롤러를 탐색 컨트롤러 스택으로 푸시 할 수 없습니다. 이것이 뷰 컨트롤러가 스택에 푸시되지 않았고 팝할 수 없기 때문에 self.navigationController가 nil을 반환하는 이유입니다.

iOS 7에서 앱을 작동해야 할 때 Apple이 Xcode에서이 경우에 대한 알림을 추가하지 않은 이유를 이해할 수 없습니다. 그들은 Push 메서드가 더 이상 사용되지 않는다고 말하지만 Show는 iOS 7에서 제대로 작동하지 않습니다.

문제를 해결하기 위해 무엇을 했습니까?

.h로 MYShowSegue 클래스를 만들었습니다.

#import <UIKit/UIKit.h>

@interface MYShowSegue : UIStoryboardSegue

@end

수행 방법이 하나 뿐인 .m 파일 :

#import "MYShowSegue.h"

@implementation MYShowSegue

- (void) perform {

    if ([[[self sourceViewController] navigationController] respondsToSelector:@selector(showViewController:sender:)]) {

        id sender = nil;
        [[[self sourceViewController] navigationController] showViewController:[self destinationViewController] sender:sender];
    }else{

        [[[self sourceViewController] navigationController] pushViewController:[self destinationViewController] animated:YES];
    }
}

@end

Storyboard의 각 segue에 대해 사용자 정의 유형 을 설정하고 새 클래스를 선택해야합니다. 제 경우에는 MYShowSegue였습니다.

Custom Segue 예

이 솔루션은 iOS 7 앱을 완벽하게 지원하는 데 도움이 될 것입니다. pushViewController 메서드를 사용 하여 뷰를 푸시하고 iOS 8,9 등의 경우 segue는 새로운 (iOS 8) 메서드 showViewController 와 함께 작동합니다.

Storyboard의 모든 segue에 대해 똑같이하는 것을 잊지 마십시오.


니스 솔루션 - 대신 "사용하지 않는"네비게이션 컨트롤러를 추가하는 (나를 위해 일한 ...
Laurenz 행운을

1

이것은 iOS 10.x에서 여전히 발생합니다.

segues를 삭제하고 복원해도 문제가 해결되지 않았습니다.

문제 : 필요한 기능은 '푸시'(실제로는 세부 정보 표시)로만 작동하는 7 개의 세그 였지만 실제로 내가 추가 한 첫 번째 세그 만 ​​푸시하고 나머지는 모두 모달로 작동합니다. 이것은 Interface Builder가 각 segue를 동일하게 설명하고 있음에도 불구하고 마찬가지입니다.

해결책 : 나는 그것을 가지고 있지 않은 6 개의 segues에 액션을 추가해야했다.

원본 스토리 보드 XML

<connections>
  <segue destination="tIr-4a-WfZ" kind="showDetail" identifier="A" action="showViewController:sender:" id="8yd-Ne-7KA"/>
  <segue destination="4mB-YE-5dM" kind="showDetail" identifier="B" id="Uod-JC-786"/>
  <segue destination="Qh5-bJ-KcE" kind="showDetail" identifier="C" id="3PW-nV-hWl"/>
  <segue destination="EI6-f4-QBB" kind="showDetail" identifier="D" id="WUK-ju-KDm"/>
  <segue destination="nTz-N4-fpW" kind="showDetail" identifier="E" id="Id6-bW-Huc"/>
  <segue destination="JEp-CH-6dW" kind="showDetail" identifier="F" id="G0L-XW-7f4"/>
  <segue destination="AET-S1-O6h" kind="showDetail" identifier="G" id="3NK-93-wTy"/>
</connections>

showViewController : sender를 추가하여 이것을 변경했습니다.

<connections>
  <segue destination="tIr-4a-WfZ" kind="showDetail" identifier="A" action="showViewController:sender:" id="8yd-Ne-7KA"/>
  <segue destination="4mB-YE-5dM" kind="showDetail" identifier="B" action="showViewController:sender:" id="Uod-JC-786"/>
  <segue destination="Qh5-bJ-KcE" kind="showDetail" identifier="C" action="showViewController:sender:" id="3PW-nV-hWl"/>
  <segue destination="EI6-f4-QBB" kind="showDetail" identifier="D" action="showViewController:sender:" id="WUK-ju-KDm"/>
  <segue destination="nTz-N4-fpW" kind="showDetail" identifier="E" action="showViewController:sender:" id="Id6-bW-Huc"/>
  <segue destination="JEp-CH-6dW" kind="showDetail" identifier="F" action="showViewController:sender:" id="G0L-XW-7f4"/>
  <segue destination="AET-S1-O6h" kind="showDetail" identifier="G" action="showViewController:sender:" id="3NK-93-wTy"/>
</connections>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.