Hello, iOS - 심층 분석

빠른 시작 연습에서는 기본 Xamarin.iOS 애플리케이션의 빌드 및 실행을 소개하였습니다. 이제, 더 복잡한 프로그램을 빌드할 수 있도록 iOS 애플리케이션의 작동 방식을 심층적으로 알아볼 시간입니다. 이 가이드에서는 iOS 애플리케이션 개발의 기본 개념을 이해할 수 있도록 Hello, iOS 연습에 있는 단계를 검토합니다.

이 가이드는 단일 화면 iOS 애플리케이션을 빌드하는 데 필요한 기술 및 정보를 개발하는 데 유용합니다. 이를 통해 Xamarin.iOS 애플리케이션의 서로 다른 파트들을 이해하고 어떻게 서로 맞도록 조정하는지에 대해 습득합니다.

Mac용 Visual Studio 소개

Mac용 Visual Studio는 Visual Studio와 XCode의 기능을 결합하는 무료 오픈 소스 IDE입니다. 완전히 통합된 비주얼 디자이너, 리팩터리 도구가 함께 포함된 텍스트 편집기, 어셈블리 브라우저, 소스 코드 통합 등을 제공합니다. 이 가이드는 몇 가지 기본 Mac용 Visual Studio 기능을 소개하지만, Mac용 Visual Studio를 처음 접하는 경우 Mac용 Visual Studio 설명서를 확인하세요.

Mac용 Visual Studio는 코드를 솔루션프로젝트로 구성하는 Visual Studio 연습을 따릅니다. 솔루션은 하나 이상의 프로젝트를 포함할 수 있는 컨테이너입니다. 프로젝트는 애플리케이션(예: iOS 또는 Android), 지원 라이브러리, 테스트 애플리케이션 등이 될 수 있습니다. 단일 뷰 애플리케이션 템플릿을 사용하여 Phoneword 앱에서 새 iPhone 프로젝트가 추가됩니다. 초기 솔루션은 다음과 같았습니다.

A screenshot of the initial solution

Visual Studio 소개

Visual Studio는 Microsoft의 강력한 IDE입니다. 완전히 통합된 비주얼 디자이너, 리팩터리 도구가 함께 포함된 텍스트 편집기, 어셈블리 브라우저, 소스 코드 통합 등을 제공합니다. 이 가이드에서는 Visual Studio용 Xamarin 도구를 사용한 몇 가지 기본적인 Visual Studio 기능을 소개합니다.

Visual Studio는 코드를 솔루션 및 프로젝트로 구성합니다. 솔루션은 하나 이상의 프로젝트를 포함할 수 있는 컨테이너입니다. 프로젝트는 애플리케이션(예: iOS 또는 Android), 지원 라이브러리, 테스트 애플리케이션 등이 될 수 있습니다. 단일 뷰 애플리케이션 템플릿을 사용하여 Phoneword 앱에서 새 iPhone 프로젝트가 추가됩니다. 초기 솔루션은 다음과 같았습니다.

A screenshot of the initial solution

Xamarin.iOS 애플리케이션 분석

왼쪽은 솔루션 패드로, 솔루션과 연결된 디렉터리 구조와 모든 파일이 포함됩니다.

The solution Pad, which contains the directory structure and all the files associated with the solution

오른쪽은 솔루션 창으로, 솔루션과 연결된 디렉터리 구조와 모든 파일이 포함됩니다.

The solution Pane, which contains the directory structure and all the files associated with the solution

Hello, iOS 연습에서는 Phoneword라는 솔루션을 만들고 내부에 iOS 프로젝트인 Phoneword_iOS를 배치했습니다. 프로젝트 내에 있는 항목은 다음과 같습니다.

  • References - 애플리케이션을 빌드하고 실행하는 데 필요한 어셈블리가 포함됩니다. 디렉터리를 확장하면 Xamarin.iOS 어셈블리에 대한 참조와 함께 System, System.Core 및 System.Xml과 같은 .NET 어셈블리에 대한 참조를 확인할 수 있습니다.
  • Packages - Packages 디렉터리에는 미리 만들어진 NuGet 패키지가 포함됩니다.
  • Resources - Resources 폴더는 기타 미디어를 저장합니다.
  • Main.cs – 여기에는 애플리케이션의 주요 진입점이 포함됩니다. 애플리케이션을 시작하려면 주 애플리케이션 클래스의 이름인 AppDelegate가 전달됩니다.
  • AppDelegate.cs – 이 파일은 주 애플리케이션 클래스를 포함하며 창을 만들고, 사용자 인터페이스를 빌드하고, 운영 체제에서 이벤트를 수신 대기하는 역할을 담당합니다.
  • Main.storyboard - 스토리보드는 애플리케이션의 사용자 인터페이스의 시각적 디자인을 포함합니다. 스토리보드 파일은 iOS 디자이너라고 하는 그래픽 편집기에서 엽니다.
  • ViewController.cs – 뷰 컨트롤러는 사용자가 보고 터치하는 화면(뷰)을 제공합니다. 뷰 컨트롤러는 사용자와 뷰 간 상호 작용을 처리하는 일을 담당합니다.
  • ViewController.designer.csdesigner.cs는 뷰의 컨트롤과 뷰 컨트롤러에서 해당 코드 표현 간의 연결점으로 사용되는 자동으로 생성되는 파일입니다. 내부 배관 파일이기 때문에 IDE는 수동 변경을 덮어쓰게 되며 대부분의 경우 이 파일은 무시할 수 있습니다.
  • Info.plistInfo.plist에서는 애플리케이션 이름, 아이콘, 시작 이미지 등과 같은 애플리케이션 속성이 설정됩니다. 강력한 파일로, 전체 소개는 속성 목록 작업 가이드에서 확인할 수 있습니다.
  • Entitlements.plist - 자격 속성 목록을 통해 iCloud, PassKit 등의 기능(앱 스토어 기술이라고도 함)을 지정할 수 있습니다. Entitlements.plist에 대한 자세한 내용은 속성 목록 작업 가이드에서 확인할 수 있습니다. 자격에 대한 일반적인 소개의 경우 디바이스 프로비전 가이드를 참조하세요.

아키텍처 및 앱 기본 사항

iOS 애플리케이션이 사용자 인터페이스를 로드하려면 두 가지 사항이 준비되어야 합니다. 첫 번째, 애플리케이션은 애플리케이션의 프로세스가 메모리에 로드될 때 실행하는 첫 번째 코드인 진입점을 정의해야 합니다. 두 번째, 애플리케이션 수준의 이벤트를 처리하고 운영 체제와 상호 작용하는 클래스를 정의해야 합니다.

이 섹션에서는 다음 다이어그램에 표시된 관계를 연구합니다.

The Architecture and App Fundamentals relationships are illustrated in this diagram

기본 메서드

iOS 애플리케이션의 주 진입점은 Application 클래스입니다. Application 클래스는 Main.cs 파일에 정의되어 있으며 정적 Main 메서드를 포함합니다. 새 Xamarin.iOS 애플리케이션 인스턴스를 만들고 OS 이벤트를 처리하는 애플리케이션 대리자 클래스의 이름을 전달합니다. 정적 Main 메서드에 대한 템플릿 코드가 아래에 나와 있습니다.

using System;
using UIKit;

namespace Phoneword_iOS
{
    public class Application
    {
        static void Main (string[] args)
        {
            UIApplication.Main (args, null, "AppDelegate");
        }
    }
}

애플리케이션 대리자

iOS에서 애플리케이션 대리자 클래스는 시스템 이벤트를 처리합니다. 이 클래스는 AppDelegate.cs 안에 있습니다. AppDelegate 클래스는 애플리케이션 을 관리합니다. 창은 사용자 인터페이스에 대한 컨테이너 역할을 하는 UIWindow 클래스의 단일 인스턴스입니다. 기본적으로 애플리케이션은 콘텐츠를 로드할 하나의 창만 가져오고, 창은 실제 디바이스 화면의 크기와 일치하는 경계 사각형을 제공하는 화면(단일 UIScreen 인스턴스)에 연결됩니다.

또한 AppDelegate는 앱 시작이 종료될 때 또는 메모리가 부족할 때와 중요한 애플리케이션 이벤트에 대한 시스템 업데이트를 구독하는 역할을 합니다.

AppDelegate에 대한 템플릿 코드는 아래와 같습니다.

using System;
using Foundation;
using UIKit;

namespace Phoneword_iOS
{

    [Register ("AppDelegate")]
    public partial class AppDelegate : UIApplicationDelegate
    {
        public override UIWindow Window {
            get;
            set;
        }

        ...
    }
}

애플리케이션이 해당 창을 정의하면 사용자 인터페이스 로드를 시작할 수 있습니다. 다음 섹션에서는 UI 만들기를 탐색합니다.

사용자 인터페이스

iOS 앱의 사용자 인터페이스는 storefront와 비슷합니다. 애플리케이션은 일반적으로 하나의 창을 가져오지만 필요한 많은 개체로 채울 수 있으며 개체 및 배열은 앱이 표시하려고 항목에 따라 변경할 수 있습니다. 사용자에게 표시되는 항목인 이 시나리오의 개체를 뷰라고 합니다. 애플리케이션에서 단일 화면을 빌드하려면 뷰가 콘텐츠 뷰 계층 구조에 쌓이고 계층 구조는 단일 뷰 컨트롤러에서 관리됩니다. 여러 화면이 있는 애플리케이션은 각각 고유한 뷰 컨트롤러가 있는 여러 콘텐츠 뷰 계층 구조가 있으며, 애플리케이션은 사용자가 보는 화면에 따라 다른 콘텐츠 뷰 계층 구조를 만들도록 창에 뷰를 배치합니다.

스토리보드를 사용하여 사용자 인터페이스를 빌드하는 방법에 관한 자세한 내용은 Apple의 iOS Developer Library에 있는 Xcode Overview(Xcode 개요)의 Designing with Storyboards(스토리보드를 사용하여 디자인) 섹션을 참조하세요.

다음 다이어그램에는 디바이스 화면에 사용자 인터페이스를 가져오는 창, 뷰, 하위 뷰 및 뷰 컨트롤러 간의 관계가 나와 있습니다.

The relationships between the Window, Views, Subviews, and view controller

다음 섹션에서는 코드에서 뷰를 사용하고 뷰 컨트롤러 및 뷰 수명 주기를 사용하여 사용자 상호 작용을 프로그래밍하는 방법에 대해 알아봅니다.

뷰 컨트롤러 및 뷰 수명 주기

모든 콘텐츠 뷰 계층 구조에는 사용자 상호 작용을 구동하는 해당 뷰 컨트롤러가 있습니다. 뷰 컨트롤러의 역할은 콘텐츠 뷰 계층 구조에서 뷰를 관리하는 것입니다. 뷰 컨트롤러는 콘텐츠 뷰 계층 구조의 일부가 아니며 인터페이스에는 요소가 없습니다. 대신, 화면에서 개체와 사용자의 상호 작용을 구동하는 코드를 제공합니다.

뷰 컨트롤러 및 스토리보드

뷰 컨트롤러는 장면의 아래쪽에 표시줄로 스토리보드에 표시됩니다. 뷰 컨트롤러를 선택하면 해당 속성이 Properties Pad에 나타납니다.

Selecting the view controller brings up its properties in the Properties Pane

이 장면으로 표시되는 콘텐츠 뷰 계층 구조에 대한 사용자 지정 뷰 컨트롤러 클래스는 Properties Pad에 있는 ID 섹션의 클래스 속성을 편집하여 설정할 수 있습니다. 예를 들어 Phoneword 애플리케이션은 아래 스크린샷에 나온 것처럼 ViewController를 첫 번째 화면에 대한 뷰 컨트롤러로 설정합니다.

The Phoneword application sets the ViewController as the view controller

뷰 컨트롤러는 장면의 아래쪽에 표시줄로 스토리보드에 표시됩니다. 뷰 컨트롤러를 선택하면 해당 속성이 속성 창에 나타남

Selecting the view controller brings up its properties in the Properties Pane

이 장면으로 표시되는 콘텐츠 뷰 계층 구조에 대한 사용자 지정 뷰 컨트롤러 클래스는 속성 창에 있는 ID 섹션의 클래스 속성을 편집하여 설정할 수 있습니다. 예를 들어 Phoneword 애플리케이션은 아래 스크린샷에 나온 것처럼 ViewController를 첫 번째 화면에 대한 뷰 컨트롤러로 설정합니다.

The Phoneword application sets the ViewController as the view controller

그러면 뷰 컨트롤러의 스토리보드 표시가 ViewController C# 클래스로 연결됩니다. ViewController.cs 파일을 열고, 아래 코드에 나온 것처럼 뷰 컨트롤러가 UIViewController하위 클래스임을 확인합니다.

public partial class ViewController : UIViewController
{
    public ViewController (IntPtr handle) : base (handle)
    {

    }
}

이제 ViewController가 스토리보드에서 이 뷰 컨트롤러와 연결된 콘텐츠 뷰 계층 구조의 상호 작용을 수행합니다. 다음으로는 뷰 수명 주기라고 하는 프로세스를 소개함으로써 뷰를 관리할 때 뷰 컨트롤러의 역할에 대해 알아봅니다.

참고 항목

사용자 상호 작용이 필요 없는 시각적 개체 전용 화면의 경우 Properties Pad에서 Class 속성을 비워 둘 수 있습니다. 이는 뷰 컨트롤러의 지원 클래스를 UIViewController의 기본 구현으로 설정하며, 이는 추가 사용자 지정 코드에서 계획하지 않은 경우 적절합니다.

뷰 수명 주기

뷰 컨트롤러는 창에서 콘텐츠 뷰 계층 구조를 로드하거나 언로드합니다. 콘텐츠 뷰 계층 구조에서 뷰에서 중요한 문제가 발생한 경우 운영 체제는 뷰 수명 주기의 이벤트를 통해 뷰 컨트롤러에 알립니다. 뷰 수명 주기에서 메서드를 재정의하면 화면에서 개체와 상호 작용할 수 있으며 동적이고 응답성이 뛰어난 사용자 인터페이스를 만들 수 있습니다.

다음은 기본 수명 주기 메서드 및 해당 기능입니다.

  • ViewDidLoad - 처음에 한 번 호출되면 뷰 컨트롤러가 해당 콘텐츠 뷰 계층 구조를 메모리에 로드합니다. 코드에서 하위 뷰를 먼저 사용할 수 있게 되므로 초기 설치 프로그램을 수행하는 것이 좋습니다.
  • ViewWillAppear - 호출될 때마다 뷰 컨트롤러의 뷰가 콘텐츠 뷰 계층 구조에 추가되고 화면에 나타납니다.
  • ViewWillDisappear - 호출될 때마다 뷰 컨트롤러의 뷰가 콘텐츠 뷰 계층 구조에서 제거되고 화면에서 사라집니다. 이 수명 주기 이벤트는 상태를 정리 및 저장하는 데 사용됩니다.
  • ViewDidAppearViewDidDisappear - 각각 뷰가 콘텐츠 뷰 계층 구조에서 추가되거나 제거되는 경우 호출됩니다.

사용자 지정 코드가 수명 주기의 단계에서 추가되는 경우 해당 수명 주기 메서드의 기본 구현재정의되어야 합니다. 이는 일부 코드가 이미 연결되어 있는 기존 수명 주기 메서드를 이용하고 추가 코드로 확장하여 달성됩니다. 원본 코드가 새 코드보다 먼저 실행되도록 메서드 내에서 기본 구현을 호출합니다. 다음 섹션에서 이러한 예제를 설명합니다.

뷰 컨트롤러 작업에 대한 자세한 내용은 Apple의 iOS에 대한 뷰 컨트롤러 프로그래밍 가이드UIViewController 참조를 확인하세요.

사용자 상호 작용에 응답

뷰 컨트롤러의 가장 중요한 역할은 단추 누르기, 탐색 등과 같은 사용자 상호 작용에 응답하는 것입니다. 사용자 상호 작용을 처리하는 가장 간단한 방법은 사용자 입력을 수신 대기하도록 컨트롤을 연결하고 입력에 응답하도록 이벤트 처리기를 연결하는 것입니다. 예를 들어 Phoneword 앱에 설명되어 있듯이 터치 이벤트에 응답하도록 단추를 연결할 수 있습니다.

이 작업이 어떻게 작동하는지 살펴보겠습니다. Phoneword_iOS 프로젝트에서 콘텐츠 뷰 계층 구조에 TranslateButton이라고 하는 단추가 추가되었습니다.

A button was added called TranslateButton to the Content View Hierarchy

Xcode Interface Builder를 사용하여 참조 출선이 만들어지면 Xcode Sync는 이를 ViewController.designer.cs의 컨트롤에 자동으로 매핑하여 ViewController 클래스 내에서 TranslateButton을 사용할 수 있도록 만듭니다. 컨트롤은 먼저 뷰 수명 주기의 ViewDidLoad 단계에서 사용할 수 있게 되므로 이 수명 주기 메서드는 사용자의 터치에 응답하는 데 사용됩니다.

public override void ViewDidLoad ()
{
    base.ViewDidLoad ();

    // wire up TranslateButton here
}

Phoneword 앱은 TouchUpInside라는 터치 이벤트를 사용하여 사용자의 터치를 수신 대기합니다. TouchUpInside는 컨트롤의 범위 내 터치 다운(화면을 터치하는 손가락)에 따르는 터치 업 이벤트(화면에서 들어올리는 손가락)를 수신 대기합니다. TouchUpInside의 반대는 사용자가 컨트롤을 누를 때 발생하는 TouchDown 이벤트입니다. TouchDown 이벤트는 많은 노이즈를 캡처하며, 사용자가 컨트롤에서 벗어나 손가락을 밀어서 터치를 취소할 수 있는 옵션은 없습니다. TouchUpInside단추 터치에 응답하는 가장 일반적인 방법이며 사용자가 단추를 누를 때 기대하는 경험을 만듭니다. 이에 대한 자세한 내용은 Apple의 iOS 휴먼 인터페이스 지침에서 확인할 수 있습니다.

앱은 람다가 있는 TouchUpInside 이벤트를 처리하지만 대리자 또는 명명된 이벤트 처리기가 사용될 수도 있습니다. 최종 단추 코드는 다음과 유사합니다.

public override void ViewDidLoad ()
{
    base.ViewDidLoad ();
    string translatedNumber = "";

    TranslateButton.TouchUpInside += (object sender, EventArgs e) => {
      translatedNumber = Core.PhonewordTranslator.ToNumber(PhoneNumberText.Text);
      PhoneNumberText.ResignFirstResponder ();

      if (translatedNumber == "") {
        CallButton.SetTitle ("Call", UIControlState.Normal);
        CallButton.Enabled = false;
      } else {
        CallButton.SetTitle ("Call " + translatedNumber, UIControlState.Normal);
        CallButton.Enabled = true;
      }
  };
}

Phoneword에 도입된 추가 개념

Phoneword 애플리케이션에는 이 가이드에서 다루지 않은 몇 가지 개념이 도입되었습니다. 이러한 개념은 다음과 같습니다.

  • 단추 텍스트 변경 – Phoneword 앱은 Button에서 SetTitle을 호출하여 새 텍스트 및 단추컨트롤 상태에 전달하여 단추의 텍스트를 변경하는 방법을 보여 줍니다. 예를 들어 다음 코드는 CallButton의 텍스트를 “Call”로 변경합니다.

    CallButton.SetTitle ("Call", UIControlState.Normal);
    
  • 설정/해제 단추단추Enabled 또는 Disabled 상태일 수 있습니다. 사용하지 않도록 설정된 단추는 사용자 입력에 응답하지 않습니다. 예를 들어 다음 코드에서는 CallButton을 사용하지 않습니다.

    CallButton.Enabled = false;
    

    단추에 대한 자세한 내용은 단추 가이드를 참조하세요.

  • 키보드 해제 – 사용자가 텍스트 필드를 탭하면 iOS는 사용자가 입력할 수 있도록 키보드를 표시합니다. 그러나 키보드를 해제할 수 있는 기본 제공 기능은 없습니다. 사용자가 TranslateButton을 누르면 다음 코드가 TranslateButton에 추가되어 키보드를 해제합니다.

    PhoneNumberText.ResignFirstResponder ();
    

    키보드 해제에 대한 또 다른 예는 키보드 해제 레시피를 참조하세요.

  • URL로 전화 걸기 – Phoneword 앱에서는 시스템 전화 앱을 실행하는 데 Apple URL 구성표가 사용됩니다. 사용자 지정 URL 구성표는 아래 코드에 표시된 것처럼 “tel:” 접두사와 번역된 전화 번호로 구성됩니다.

    var url = new NSUrl ("tel:" + translatedNumber);
    if (!UIApplication.SharedApplication.OpenUrl (url))
    {
        // show alert Controller
    }
    
  • 경고 표시 – 사용자가 통화를 지원하지 않는 디바이스(예: 시뮬레이터 또는 iPod Touch)에서 전화 걸기를 시도하는 경우 사용자에게 전화를 걸 수 없음을 알리는 경고 대화 상자가 표시됩니다. 아래 코드는 경고 컨트롤러를 만들고 채웁니다.

    if (!UIApplication.SharedApplication.OpenUrl (url)) {
                    var alert = UIAlertController.Create ("Not supported", "Scheme 'tel:' is not supported on this device", UIAlertControllerStyle.Alert);
                    alert.AddAction (UIAlertAction.Create ("Ok", UIAlertActionStyle.Default, null));
                    PresentViewController (alert, true, null);
                }
    

    iOS 경고 보기에 대한 자세한 내용은 경고 컨트롤러 레시피를 참조하세요.

터치 테스트, 배포 및 마무리

Mac용 Visual Studio와 Visual Studio 모두 애플리케이션을 테스트하고 배포하기 위한 다양한 옵션을 제공합니다. 이 섹션에서는 디버깅 옵션에 대해 다루고, 디바이스에서 애플리케이션 테스트하기에 대해 설명하며, 사용자 지정 앱 아이콘 및 시작 이미지를 만들기 위한 도구를 소개합니다.

디버깅 도구

경우에 따라 애플리케이션 코드의 문제는 진단하기가 어렵습니다. 복잡한 코드 문제를 진단하려면 중단점을 설정하거나, 코드를 단계별 실행하거나, 로그 창에 정보를 출력합니다.

디바이스에 배포

iOS 시뮬레이터는 애플리케이션을 테스트하기 위한 빠른 방법입니다. 시뮬레이터에는 모의 위치, 이동 시뮬레이션 등을 포함한 테스트에 유용한 최적화가 많이 있습니다. 그러나 사용자는 시뮬레이터에서 최종 앱을 사용하지 않습니다. 모든 애플리케이션은 조기에 그리고 자주 실제 디바이스에서 테스트해야 합니다.

디바이스를 프로비전하는 데는 시간이 걸리며 Apple 개발자 계정이 있어야 합니다. 디바이스 프로비전 가이드에 개발을 위한 디바이스 준비에 대한 철저한 지침이 나와 있습니다.

참고 항목

현재 Apple의 요구 사항에 따라 물리적 디바이스 또는 시뮬레이터용 코드를 빌드하려면 개발 인증서 또는 ‘서명 ID’가 필요합니다. 이를 설정하려면 디바이스 프로비전 가이드의 단계를 수행합니다.

디바이스가 프로비전되고 나면, 다음 스크린샷에 표시된 것처럼 플러그 인하고 빌드 도구 모음에 있는 대상을 iOS 디바이스로 변경한 다음, Start(Play) 키를 눌러 배포할 수 있습니다.

Pressing Start/Play

Pressing Start/Play

앱이 iOS 디바이스에 배포합니다.

The app will deploy to the iOS device and run

사용자 지정 아이콘 및 시작 이미지 생성

모든 사용자가 사용자 지정 아이콘을 만들고 앱에서 눈에 띄는 이미지를 시작할 수 있는 디자이너가 있는 것은 아닙니다. 사용자 지정 앱 아트워크를 생성하는 몇 가지 대체 방법은 다음과 같습니다.

  • Pixelmator – Mac용 다양한 이미지 편집 앱입니다(약 $30).
  • Fiverr – 다양한 디자이너를 선택하여 자신에 게 맞는 아이콘 집합을 만들 수 있습니다(가격: $5부터). 성공할 수도 있고 아니면 실패할 수도 있지만, 즉시 디자인된 아이콘이 필요한 경우에 좋은 리소스입니다.
  • Visual Studio - IDE에서 직접 앱에 대한 간단한 아이콘 집합을 만드는 데 사용할 수 있습니다.
  • Fiverr – 다양한 디자이너를 선택하여 자신에 게 맞는 아이콘 집합을 만들 수 있습니다(가격: $5부터). 성공할 수도 있고 아니면 실패할 수도 있지만, 즉시 디자인된 아이콘이 필요한 경우에 좋은 리소스입니다.

아이콘 및 시작 이미지 크기 및 요구 사항에 대한 자세한 내용은 이미지 가이드 작업을 참조하세요.

요약

축하합니다! 이제 Xamarin.iOS 애플리케이션의 구성 요소와 이를 만드는 데 사용되는 도구에 대해 확실하게 이해했습니다. 시작하기 시리즈의 다음 자습서에서는 여러 화면을 처리하도록 애플리케이션을 확장합니다. 그 과정에서 여러 화면을 처리하도록 애플리케이션을 확장하면서 탐색 컨트롤러를 구현하고, 스토리보드 Segues에 대해 알아보며, MVC(모델, 뷰, 컨트롤러) 패턴을 소개합니다.