<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>5n_tak</title>
        <link>https://velog.io/</link>
        <description>iOS 왕초보를 위한 블로그</description>
        <lastBuildDate>Wed, 03 Nov 2021 09:35:24 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>5n_tak</title>
            <url>https://images.velog.io/images/5n_tak/profile/7cbc5498-c976-419e-b3da-a2f93f70a5ed/BB473EBB-2641-47C6-B3A3-B7E693875EE2_1_201_a.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 5n_tak. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/5n_tak" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Swift] ViewController 화면전환 방법]]></title>
            <link>https://velog.io/@5n_tak/Swift-ViewController-%ED%99%94%EB%A9%B4%EC%A0%84%ED%99%98-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@5n_tak/Swift-ViewController-%ED%99%94%EB%A9%B4%EC%A0%84%ED%99%98-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Wed, 03 Nov 2021 09:35:24 GMT</pubDate>
            <description><![CDATA[<p>ViewController의 화면 전환 방법에 대해 알아보자.</p>
<p>화면 전환 방법에는 대표적으로 네 가지 방법이 있다.</p>
<ol>
<li>ViewController의 view 바꿔치기</li>
<li>ViewController가 다른 ViewController를 호출(present)</li>
<li>NavigationViewController 사용하여 화면 전환(push)</li>
<li>화면 전환용 객체 Segue 사용</li>
</ol>
<blockquote>
<p>ViewController의 view를 바꿔치는 방법은 메모리 overflow 위험이 있기 때문에 좋은 방법이 아니라고 한다.
오늘은 이 방식은 건너뛰고 다른 방법들을 알아보자.</p>
</blockquote>
<hr>
<h3 id="viewcontroller가-다른-viewcontroller를-호출present">ViewController가 다른 ViewController를 호출(present)</h3>
<p>필자가 가장 애용하는 방식이자 가장 대표적인 방법이 아닐까 싶다.
다른 ViewController를 Modal로 띄우는 방법으로 다음 코드를 사용한다.</p>
<pre><code>guard let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: &quot;secondViewControllerID&quot;) as? SecondViewController else { return }
        // 화면 전환 애니메이션 설정
        secondViewController.modalTransitionStyle = .coverVertical
        // 전환된 화면이 보여지는 방법 설정 (fullScreen)
        secondViewController.modalPresentationStyle = .fullScreen
        self.present(secondViewController, animated: true, completion: nil)</code></pre><p>위 코드를 <code>@IBAction func</code> 메서드안에 작성한 후 Storyboard에서 ViewController의 connection inspector 에서 해당하는 Button과 연결시켜주면 된다.
<img src="https://images.velog.io/images/5n_tak/post/6d8d6aee-6a02-4162-909e-5a118f8054e2/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202021-11-03%20%EC%98%A4%ED%9B%84%203.48.13.png" width="60%"></p>
<blockquote>
<p>단 Storyboard상의 SecondViewController의 identify inspector에서 <code>instantiateViewController</code>의 <code>identifier 값(secondViewControllerID)</code>을 StoryboardID에 적어주어야 한다.
<img src="https://images.velog.io/images/5n_tak/post/0233affa-9f04-43f8-980e-fc89f1cb37e1/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202021-11-03%20%EC%98%A4%ED%9B%84%203.47.39.png" width="30%"></p>
</blockquote>
<p>이후에 secondViewController에서 다시 첫번째 ViewController로 돌아가는 버튼도 만들어 줬다.</p>
<pre><code>@IBAction func back(_ sender: Any) {
        self.presentingViewController?.dismiss(animated: true)
}</code></pre><p>버튼을 클릭하면 정상적으로 화면 전환이 되는걸 확인할 수 있다.
<img src="https://images.velog.io/images/5n_tak/post/286d80a5-9322-432a-a33e-a9d0586ddf6e/Simulator%20Screen%20Recording%20-%20iPhone%2012%20Pro%20Max%20-%202021-11-03%20at%2017.05.25.gif"></p>
<hr>
<h3 id="navigationcontroller-사용하여-화면-전환showpush">NavigationController 사용하여 화면 전환(show==push)</h3>
<p>NavigationController를 사용하기 때문에 먼저 NavigationController를 embed in 해주어야 한다.
storyboard에서 첫번째 ViewController에 커서를 맞춘뒤 아래 사진처럼 embed in 한다.<img src="https://images.velog.io/images/5n_tak/post/432551ec-61a9-4a8b-957a-967214743fd7/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202021-11-03%20%EC%98%A4%ED%9B%84%205.18.41.png" width = "60%">그럼 storyboard상에는 이렇게 표시된다. <img src="https://images.velog.io/images/5n_tak/post/e1d6d08c-ceb4-4201-8ef5-aa6441465fc6/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202021-11-03%20%EC%98%A4%ED%9B%84%205.21.16.png" width=60%>그 후 아래 코드를 ViewController에 작성한다.</p>
<pre><code>let pushVC = self.storyboard?.instantiateViewController(withIdentifier: &quot;secondViewControllerID&quot;)

self.navigationController?.pushViewController(pushVC!, animated: true)</code></pre><p>이게 끝이다. 잘 실행되는 것을 확인할 수 있다.<img src="https://images.velog.io/images/5n_tak/post/6c0c714f-0914-4f53-aca6-26a24bbddf2c/Simulator%20Screen%20Recording%20-%20iPhone%2012%20Pro%20Max%20-%202021-11-03%20at%2017.26.10.gif"></p>
<blockquote>
<p>이번에는 secondViewController에서 back버튼을 구현해주지 않았다. NavigationController는 Stack에 쌓이는 방식이기 때문에 back버튼이 자동으로 생성되기 때문이다.</p>
</blockquote>
<hr>
<h3 id="화면-전환용-객체-segue-사용">화면 전환용 객체 Segue 사용</h3>
<p>Segue를 사용하는 방식은 storyboard상에서 경로가 시각적으로 나타난다.
이 방식의 장점은 ViewController에 대한 정보를 몰라도 화면 전환이 가능하다는 것이다.
Segue에도 종류가 있다.</p>
<p>1) Action Segue: 출발점이 ViewController가 아닌 것(ex: button)</p>
<ul>
<li>따로 코딩이 필요하지 않다.
<img src="https://images.velog.io/images/5n_tak/post/737e51a3-3aa1-49a5-bf69-baf67e9576f2/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202021-11-03%20%EC%98%A4%ED%9B%84%205.41.33.png" width = 50%>마우스 우클릭 또는 control키를 누른 상태로 드래그해서 <img src="https://images.velog.io/images/5n_tak/post/4ad8d420-7caa-4daf-89b1-c024ac658432/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202021-11-03%20%EC%98%A4%ED%9B%84%205.41.38.png" width = 50%>모두 화면전환이 가능하지만 각각 다른 기능을 한다는 것만 알아두고 넘어가자. 우리는 show를 클릭할 거다. 그럼 끝이다.<blockquote>
<p>여기서 secondViewController가 Modal형식으로 띄워지는게 싫다면 attributes inspector에서 presentation을 fullscreen으로 변경해주면 된다.<img src="https://images.velog.io/images/5n_tak/post/7b874062-68b4-48c1-a25c-320eda909c76/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202021-11-03%20%EC%98%A4%ED%9B%84%205.54.47.png" width=30%></p>
</blockquote>
</li>
</ul>
<p>2) Manual Segue: 출발점이 ViewController인 것</p>
<ul>
<li><code>performSegue(withIdentifier: sender:)</code>를 구현해야 한다.
(1) 이동<pre><code>  - ViewController를 이동시킬 부분에 drag&amp;drop -&gt; &quot;show&quot;선택 -&gt; &quot;segue identifier&quot;기입
  - 이용하고 싶은 곳에서 performSegue로 호출
  ```
  @IBAction func move(_ sender: Any) {
      self.performSegue(withIdentifier: &quot;mySegue&quot;, sender: self)
  }
  ```</code></pre>(2) unwind<ul>
<li>출발점 ViewController에 임의의 메서드 @IBAction으로 등록 -&gt; unwind할 viewController에서 되돌아가는 버튼에서 Dock bar의 &quot;Exit&quot;에 drag&amp;drop<pre><code>@IBAction func unwindToVC(_ segue: UIStoryboardSegue) {
}</code></pre>※위 메서드를 처음에 이동한 ViewController에 작성하는 것을 주의!</li>
</ul>
</li>
</ul>
<p>3) SegueWay 발생 전에 발동 메서드</p>
<ul>
<li><code>prepare(for: sender: ) {...}</code> 구현</li>
<li><code>if segue.identifier == &quot;SegueWayName&quot;</code> 특정 SegueWay 구분해서 사용<pre><code>override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  if(segue.identifier == &quot;mySegue1&quot;) {
      // one
  } else {
      // ...
  }
}</code></pre></li>
</ul>
<hr>
<blockquote>
<p>⚠️ <strong>주의!</strong>
segue를 통해 화면을 연결하다 보면 View가 많아졌을 시 지저분해 보일 수 있음...<img src="https://images.velog.io/images/5n_tak/post/adc04ee5-f39f-43c8-81b5-d75cbc7eee82/R1280x0-2.png"></p>
</blockquote>
<blockquote>
<p>해당 포스팅을 작성하면서 알게된건데 NavigationController를 Embed in 했다가 풀고 싶을 경우 단순히 생성된 NavigationController를 지우기만 하면 이후 runtime시 실행이 안될 경우가 있다.
에러메시지 -&gt; <code>[WindowScene] Failed to instantiate the default view controller for UIMainStoryboardFile &#39;Main&#39; - perhaps the designated entry point is not set?</code>
이럴 경우에 초기 ViewController 선언 에러가 난 것이므로 storyboard의 첫번째 ViewController의 attributes inspector에서 <code>Is Initial ViewController</code> 항목에 체크해주면 된다.<img src="https://images.velog.io/images/5n_tak/post/129294fd-a4c3-4d6a-9549-4377985a4a79/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202021-11-03%20%EC%98%A4%ED%9B%84%206.02.54.png" width = 30%></p>
</blockquote>
<p>참고 :</p>
<ul>
<li><a href="https://fdee.tistory.com/entry/Xcode-%EA%B8%B0%EB%8A%A5-%ED%99%94%EB%A9%B4%EC%A0%84%ED%99%98-%EC%BD%94%EB%93%9C%EB%A1%9C-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-change-ViewController-with-swift">https://fdee.tistory.com/entry/Xcode-기능-화면전환-코드로-하는-방법-change-ViewController-with-swift</a></li>
<li><a href="https://fdee.tistory.com/entry/Xcode-%EA%B8%B0%EB%8A%A5-%ED%99%94%EB%A9%B4%EC%A0%84%ED%99%98%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-change-ViewController">https://fdee.tistory.com/entry/Xcode-기능-화면전환하는-방법-change-ViewController</a></li>
<li><a href="https://developerbee.tistory.com/41">https://developerbee.tistory.com/41</a></li>
<li><a href="https://ios-development.tistory.com/19">https://ios-development.tistory.com/19</a></li>
<li><a href="https://twih1203.medium.com/swift-ios-%ED%99%94%EB%A9%B4%EC%A0%84%ED%99%98%ED%95%98%EA%B8%B0-5e5998679d3a">https://twih1203.medium.com/swift-ios-화면전환하기-5e5998679d3a</a></li>
<li><a href="https://doodledevnote.tistory.com/25">https://doodledevnote.tistory.com/25</a></li>
</ul>
]]></description>
        </item>
    </channel>
</rss>