【iOS】내가 추천하는 화면 천이 방법

7744 단어 iOSObjective-C
여러분은 화면 전이를 정의할 때 Storyboard의 Segue를 사용하고 있습니까?



위 그림과 같이 화면 A -> 화면 B -> 화면 C와 간단한 전환만의 앱이라면 Segue는 좋을지도 모릅니다. 그러나 본격적인 앱을 만들어 가면 아무래도 화면 A에서 화면 C로 날지 않으면 요구 사항을 충족시키지 못하는 경우가 있습니다. 화면수도 늘어나면, Segue의 선도 문어 다리 배선과 같이 고차고차한 느낌에 끌려 보기 힘들어져 갑니다.
실제 작업면에서 말하면, 13 인치 MacBook과 같은 좁은 화면에서 선을 당겨 ViewController를 연결하는 작업은 꽤 스트레스입니다 ...

그래서 나는 Segue를 사용하지 않고 코드로 화면 전환하는 방법을 추천하고 있습니다.

하지만 스토리보드를 완전히 사용하지는 않습니다. View의 레이아웃은 Storyboard를 사용하는 것이 역시 편하다고 생각합니다.

이 기사에서는 화면 전환만을 코드로 정의하는 방법을 소개합니다.

Step1: Storyboard의 설정



먼저, Main.storyboard 에 로그인 화면을 만들고 있다고 가정합니다. 이 화면은 사용자가 로그인하지 않은 상태에서 로그인 없이는 사용할 수 없는 화면(예: 프로필 화면이나 구매 화면)에서 호출됩니다.

아래 그림과 같이 로그인 화면에 대한 ViewController를 선택하고 오른쪽 패널의 Custom Class Class에 이 ViewController의 클래스 이름을 입력합니다.
예) SignInViewControllerIdentity의 스토리보드 ID에 고유한 문자열을 입력합니다.
예) SignIn


Step2: 전환 대상 ViewController 구현



헤더 파일에는 SignInViewController 클래스의 인스턴스를 생성하는 클래스 메소드만을 정의합니다. 이 메소드에서는 NSString 형의 메세지를 인수로서 받도록 하고 있습니다.

SignInViewController.h
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface SignInViewController : UIViewController

+ (instancetype)instantiateViewControllerWithMessage:(NSString *)msg;

@end

NS_ASSUME_NONNULL_END

구현은 다음과 같이 합니다.

SignInViewController.m
#import "SignInViewController.h"

@interface SignInViewController ()

@property (nonatomic) NSString *msg;

@end

@implementation SignInViewController

+ (instancetype)instantiateViewControllerWithMessage:(NSString *)msg {
    // SignInViewControllerのインスタンスを生成
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    SignInViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SignIn"];

    // 画面遷移アニメーションの設定(お好きなものを)
    vc.modalTransitionStyle = UIModalTransitionStyleCoverVertical;

    // 遷移元から渡された値を保持
    vc.msg = msg;

    return vc;
}

...

@end
storyboardWithName: 메서드의 인수는 스토리 보드 이름을 지정합니다. Main.storyboard 그렇다면 Main .instantiateViewControllerWithIdentifier: 메서드의 인수는 Step1에서 설정한 스토리 보드 ID를 지정합니다.

이 방법의 마음에 드는 점은, 안이하게 ViewController의 프로퍼티을 외부에 공개하지 않아도 된다는 것입니다. readwrite msg 속성을 .h 파일에 쓰지 않습니다.
메소드명으로부터 천이처에 건네주지 않으면 안 되는 값이 무엇인가 이해하기 쉽습니다.

Step3: 전환 소스 ViewController 구현



예를 들어 구매 화면을 표시 할 때 사용자가 로그인되지 않은 상태이므로 로그인 화면으로 전환합니다.

BuyViewController.m
...

#import "SignInViewController.h"

...

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    if (/*サインインしていない*/) {
        // サインイン画面へ
        id vc = [SignInViewController instantiateViewControllerWithMessage:@"購入するためにはサインインしてください"];
        [self presentViewController:vc animated:YES completion:nil];
    }
}

...

매우 간단합니다. 화면 전환을 원하는 곳에서 2,3 줄의 코드를 작성하면됩니다.
위의 예는 모달 전환이지만 NavigationController 아래에서는
[self.navigationController pushViewController:vc animated:YES];

그러면 푸시 천이합니다.

천이원의 화면으로 돌아갈 때는, 모달 천이라면,
[self dismissViewControllerAnimated:YES completion:nil];

푸시 천이라면
[self.navigationController popViewControllerAnimated:YES];

를 실행하면 됩니다.

어땠습니까? Segue를 사용하는 것보다 똑똑하다고 생각하지 않습니까?
조금이라도 iOS 개발의 참고가 되면 다행입니다.

좋은 웹페이지 즐겨찾기