기본적으로 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 문제인 것 같습니다.
답변
예, ‘푸시’대신 ‘표시’를 사용합니다.
“쇼”가 푸시처럼 작동하도록하려면 어떻게해야합니까? 가능합니까 아니면 대신 “푸시 (사용되지 않음)”를 사용해야합니까?
해야합니다. 그것은 나를 위해합니다. 저는 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는 새로운 뷰 컨트롤러의 프레젠테이션을 수행하는 방법을 결정할 때 컨텍스트를 고려한다고 설명합니다.
답변
이미 받아 들여진 답변이 있지만 이전에 사용할 수 없었던 정보를 조금 더 제공하고 싶었습니다.
앞서 언급했듯이 “push”및 “modal”segues는 더 이상 사용되지 않으며 각각 “show”및 “present modally”로 대체되었습니다. Apple의 문서에 따르면 새로운 segues는 크기 등급에 적응하는 segues로 더 나뉩니다. 이전 버전은 iOS 8 이전의 iOS 버전을 지원하는 데만 사용해야합니다.
다음 링크의 문서는 사용 가능한 모든 segues, old 및 new에 대한 설명을 설명합니다.
향후 URL이 변경되는 경우, 다음은 각각의 새 세그에 대한 설명입니다.
보여 주다
화면의 내용에 따라 상세 또는 마스터 영역에 내용을 표시합니다. 앱이 마스터 및 상세보기를 표시하는 경우 콘텐츠가 상세 영역으로 푸시됩니다. 앱이 마스터 또는 세부 정보 만 표시하는 경우 콘텐츠는 현재 뷰 컨트롤러 스택의 맨 위에 푸시됩니다.
세부 사항보기
세부 정보 영역에 콘텐츠를 표시합니다. 앱이 마스터 및 세부 정보보기를 표시하는 경우 새 콘텐츠가 현재 세부 정보를 대체합니다. 앱이 마스터 또는 세부 정보 만 표시하는 경우 콘텐츠가 현재 뷰 컨트롤러 스택의 맨 위를 대체합니다.
모달로 제시
내용을 모달로 제시하십시오. 프레젠테이션 스타일 (UIModalPresentationStyle) 및 전환 스타일 (UIModalTransitionStyle)을 선택하는 옵션이 있습니다.
Popover로 표시
콘텐츠를 기존보기에 고정 된 팝 오버로 표시합니다. 팝 오버보기의 한쪽 가장자리에 표시되는 화살표의 가능한 방향을 지정하는 옵션이 있습니다 (UIPopoverArrowDirection). 앵커보기를 지정하는 옵션도 있습니다.
답변
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 소스 코드에 특별한주의를 기울여야합니다.
답변
Scott Robertson 이 여기서 언급 했듯이 이것은 iOS 7의 버그처럼 보입니다.
iOS 8에서는 전환이 런타임시 (올바른 동작) 추론되는 반면 iOS 7에서는 전환이 디자인 타임 (버기 동작)에 유추되는 것으로 보입니다.
가장 간단한 해결 방법은 사용하지 않는 탐색 컨트롤러를 스토리 보드에 추가하고 연결하여 해당 뷰 컨트롤러가이 탐색 컨트롤러의 일부가되도록하는 것입니다. 실제로 내비게이션 컨트롤러를 인스턴스화 할 필요는 없으며, 내비게이션 컨트롤러에 포함되어 있음을 알기 위해 버그가있는 뷰 컨트롤러 만 있으면됩니다.
참고 : 탐색 모음을 시뮬레이션하는 것만으로는 이러한 용도로 충분하지 않습니다. 실제로 푸시 스택에 탐색 컨트롤러가 있어야합니다.
버그를 재현하려면 :
- 크기 클래스를 사용하는 새 스토리 보드를 만듭니다.
- 두 개의 뷰 컨트롤러를 만듭니다 (탐색 컨트롤러 없음).
- 첫 번째보기 컨트롤러가 Show (예 : Push) 를 통해 두 번째보기 컨트롤러를 표시하도록합니다. 가 버튼에 연결된 세그 하도록합니다.
- 코드에서 첫 번째보기 컨트롤러를 표시하되 탐색 컨트롤러에 삽입합니다.
initWithRootViewController:
메서드 . - iOS 7에서 앱을 실행하십시오.
- 푸시를 수행해야하는 버튼을 누릅니다.
- iOS 7에서는 푸시 대신 모달 전환이 발생합니다. iOS 8에서는 올바른 푸시 동작을 얻게됩니다.
버그를 수정하려면 :
- 스토리 보드에 탐색 컨트롤러를 추가하고 첫 번째보기 컨트롤러를 루트보기 컨트롤러로 설정합니다. (참고 : 두 번째를 루트 뷰 컨트롤러로 추가해도이 버그는 수정되지 않습니다.)
- 탐색 컨트롤러에 액세스 할 수 없다는 경고를 표시하지 않고 해결 방법으로 만 존재한다는 것을 문서화하려면 정크 식별자를 제공하십시오. (예 🙂
workaround for show segues in iOS 7
.
내비게이션 컨트롤러가 두 번째 그림에 추가 된 방법과 들어오는 화살표가 없는지 확인하십시오 (즉, 뷰 컨트롤러 식별자를 사용하는 것 외에 인스턴스화 할 방법이 없음).
답변
나는 이것에 늦었지만 내가 배운 것을 나누고 싶었다. 이것은 사실 버그이며 오늘날에도 존재합니다 (2014-12-18).
여기에 대한 기사를 썼습니다 .
쉽게 재현 할 수 있습니다. iOS8에서는 Show
segue 를 호출하기 전에 뷰 컨트롤러를 프로그래밍 방식으로 스택에 푸시하지 않는 한 iOS7.x에서도 잘 작동합니다 .
스토리 보드 연결을 사용하여 스택으로 만 푸시하면 작동합니다. 그러나 분명히 코드를 통해 푸시하면 푸시 navigationController
속성 UIViewController
이 될 nil
것이고 호출 Show
할 때 스택을 제어하는 탐색이 없기 때문에 모달이라고 가정합니다.
지금까지의 해결 방법은 코드를 통해 푸시하지 않거나 (실행 가능하지 않음) 현재 사용되지 않는 Push
.
레이더를 제출했습니다 (기사 링크). Apple이이 문제를 해결하기를 바라면서 자유롭게 중복 파일을 제출하십시오.
답변
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였습니다.
이 솔루션은 iOS 7 앱을 완벽하게 지원하는 데 도움이 될 것입니다. pushViewController 메서드를 사용 하여 뷰를 푸시하고 iOS 8,9 등의 경우 segue는 새로운 (iOS 8) 메서드 showViewController 와 함께 작동합니다.
Storyboard의 모든 segue에 대해 똑같이하는 것을 잊지 마십시오.
답변
이것은 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>