반응형
Greensky0026
삽질러의 대환장 공사판
Greensky0026
전체 방문자
오늘
어제
  • 분류 전체보기 (241)
    • Language (56)
      • JAVA (13)
      • Swift (38)
      • Kotlin (4)
      • Dart (0)
      • PHP (0)
      • JavaScript (1)
    • IDE & Framework (92)
      • Spring (10)
      • Android (48)
      • iOS (8)
      • NodeJS (1)
      • CodeIgniter (3)
      • Flutter (1)
      • 분류중 (18)
    • Infra (8)
    • Database (12)
    • VCS (4)
    • Debug Log (34)
      • java (7)
      • swift (3)
      • Android (9)
      • Web (7)
      • 삽질기 (7)
    • Others (19)
      • 코딩테스트 풀이 (0)
      • IT 이야기 (18)
    • 쉼터 (2)
    • 개발공부 (14)
      • Network (1)
      • 자료구조와 알고리즘 (2)
      • Code design (8)
      • ETC (1)
      • 아카이브 (1)

블로그 메뉴

    공지사항

    • 프로그래머스 코딩 테스트 관련글 비공개 처리

    인기 글

    태그

    • swift
    • 공부
    • 코딩테스트
    • xcode
    • ios
    • level1
    • IT
    • 타입
    • JSP
    • swfit
    • 프로그래머스
    • Java
    • 예제
    • kotlin
    • 구축
    • reduce
    • Android
    • 개발
    • map
    • 프로그래밍

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    Greensky0026

    삽질러의 대환장 공사판

    ios Storyboard간 이동
    IDE & Framework/iOS

    ios Storyboard간 이동

    2021. 4. 21. 01:35
    반응형

    서론

     소규모 프로젝트나 개인프로젝트의 경우 하나의 Storyboard에 여러 view controller를 부착해

    한눈에봐도 앱의 흐름을 파악할 수 있도록 작성할 수도 있습니다.

    그러나, 이 방법은 요즘 가장 중요한 '협업'의 관점에서 충돌관리가 굉장히 어렵다는 단점이 있습니다.

    그래서 저는 충돌을 피하고 페이지별로 작업할 수 있도록 view마다 Storyboard를 각기 작성하여 프로젝트를 진행하겠습니다.

     

    0. 전제

      Main.storyboard는 ViewContorller.swift,

     aController.storyboard는 aController.swift 쌍으로 연결되어 있는 상황입니다.

     

    1. Storyboard id 입력

      view별로 Storyboard가 따로 존재하는 환경이니, 이동을 하려면 이동할 페이지를 '참조'해 불러와야 합니다.

    이때, Storyboard id를 사용해 참조하므로 각 Storyboard마다 id를 부여해 주어야 합니다.

    Storyboard Id는 우측의 attribute inspector에서 입력할 수 있습니다.

    왼쪽부터 각각 Main.Storyboard, aController.storyboard의 Attribute inspector

     

    2. 화면전환 이벤트를 부착할 대상 생성

     button을 터치시 화면전환을 실행하도록 하겠습니다.

    버튼을 생성해 터치이벤트를 연결해줍니다.

     

    3. 화면전환 기능 코딩

     이제 버튼 터치 이벤트 안에 코드를 작성하면 되겠습니다.

    let sb = UIStoryboard(name: "aController", bundle: nil)

     위의 코드를 통해 aController.storyboard를 불러옵니다.

     

    let aController = sb.instantiateViewController(withIdentifier: "aController") as! aController

     불러온 aController.storyboard를 통해 Storyboard id인 aController로

    해당 storyboard의 view controller를 불러오고 storyboard를 초기화합니다.

     

    self.present(aController, animated: true, completion: nil)

    위의 코드를 통해 새 viewController를 출력해 줍니다.

     

    func present(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)? = nil)

    • vireControllerToPresent : 출력할 viewController
    • animated : 전환시 애니메이션 사용 여부
    • completion : present 실행 완료 후에 실행될 블록

     

    결과는 아래와 같습니다.

        @IBAction func btnMove(_ sender: UIButton) {
            
            let sb = UIStoryboard(name: "aController", bundle: nil)
            let aController = sb.instantiateViewController(withIdentifier: "aController") 
            	as! aController
            
            self.present(aController, animated: true, completion: nil)
        }

     

     

     

     무언가 위화감이 들지 않으셨나요?

    iOS13부턴 present의 기본값이 automatic으로 변경되어  

    modalPresentationStyle를 별도로 설정하지 않으면 화면을 꽉 채우지않습니다.

     

    modalPresentationStyle의 값을 간단히 알아볼까요?

    • pageSheet, formSheet
      기존 view위에 얹어진 느낌입니다. iphone에서는 차이가 없으나.
      ipad에선 formSheet은 큰 팝업창같이 상하좌우에 여백이 생깁니다.
    • fullScreen
      화면 전체를 덮습니다.
    • automatic
      카메라, 이미지보기 등 상황에 맞게 알아서 스타일을 설정합니다.

    종류별로 한번 다 실행시켜 볼까요?

        @IBAction func btnMove(_ sender: UIButton) {
            
            let sb = UIStoryboard(name: "aController", bundle: nil)
            let aController = sb.instantiateViewController(withIdentifier: "aController") as! aController
            //.automatic, .pageSheet, formSheet
            aController.modalPresentationStyle = .fullScreen
            self.present(aController,animated: true, completion: nil)
        }
        
        @IBAction func btnPageSheet(_ sender: UIButton) {
            let sb = UIStoryboard(name: "aController", bundle: nil)
            let aController = sb.instantiateViewController(withIdentifier: "aController") as! aController
            
            aController.modalPresentationStyle = .pageSheet
            self.present(aController,animated: true, completion: nil)
        }
        
        @IBAction func btnFormSheet(_ sender: UIButton) {
            let sb = UIStoryboard(name: "aController", bundle: nil)
            let aController = sb.instantiateViewController(withIdentifier: "aController") as! aController
            
            aController.modalPresentationStyle = .formSheet
            self.present(aController,animated: true, completion: nil)
        }
     
        @IBAction func btnDefault(_ sender: Any) {
            let sb = UIStoryboard(name: "aController", bundle: nil)
            let aController = sb.instantiateViewController(withIdentifier: "aController") as! aController
        
            self.present(aController,animated: true, completion: nil)
        }

     

     

     

    반응형
    저작자표시 (새창열림)

    'IDE & Framework > iOS' 카테고리의 다른 글

    Alamofire를 통해 POST/GET 통신하기  (0) 2021.04.20
    m1 기반 mac에서 cocoapod 사용하기  (0) 2021.04.20
    Storyboard 사용해보기  (0) 2021.04.15
    ios Stroyboard란?  (0) 2021.04.14
    [기상알리미] application preview  (0) 2021.04.13
      'IDE & Framework/iOS' 카테고리의 다른 글
      • Alamofire를 통해 POST/GET 통신하기
      • m1 기반 mac에서 cocoapod 사용하기
      • Storyboard 사용해보기
      • ios Stroyboard란?
      Greensky0026
      Greensky0026
      점이 모여 선이 된다. 내 삽질도 언젠간 거대한 지하 도시가 되겠지!

      티스토리툴바