Xamarin.ios의 WindowsWindows in Xamarin.Mac

이 문서에서는 Xamarin.ios 응용 프로그램에서 창과 패널을 사용 하는 방법을 설명 합니다. Xcode 및 Interface Builder에서 창과 패널을 만들고 storyboard와 xib 파일에서 로드 하 여 프로그래밍 방식으로 작업 하는 방법을 설명 합니다.This article covers working with windows and panels in a Xamarin.Mac application. It describes creating windows and panels in Xcode and Interface Builder, loading them from storyboards and .xib files, and working with them programmatically.

Xamarin.ios 응용 프로그램 C# 에서 및 .net을 사용 하는 경우 목표-CXcode 에서 작업 하는 개발자가 동일한 창과 패널에 액세스할 수 있습니다.When working with C# and .NET in a Xamarin.Mac application, you have access to the same Windows and Panels that a developer working in Objective-C and Xcode does. Xamarin.ios는 Xcode와 직접 통합 되므로 Xcode의 Interface Builder 를 사용 하 여 Windows 및 패널을 만들고 유지 관리 하거나 선택적으로 코드에서 C# 직접 만들 수 있습니다.Because Xamarin.Mac integrates directly with Xcode, you can use Xcode's Interface Builder to create and maintain your Windows and Panels (or optionally create them directly in C# code).

용도에 따라 Xamarin.ios 응용 프로그램은 표시 되 고 작동 하는 정보를 관리 하 고 조정할 수 있는 하나 이상의 창을 화면에 표시할 수 있습니다.Based on its purpose, a Xamarin.Mac application can present one or more Windows on screen to manage and coordinate the information it displays and works with. 창의 주요 기능은 다음과 같습니다.The principal functions of a window are:

  1. 보기 및 컨트롤을 배치 하 고 관리할 수 있는 영역을 제공 합니다.To provide an area in which Views and Controls can be placed and managed.
  2. 키보드와 마우스 모두의 사용자 상호 작용에 대 한 응답으로 이벤트를 수락 하 고 응답 합니다.To accept and respond to events in response to user interaction with both the keyboard and mouse.

Windows는 모덜리스 상태 (예: 한 번에 여러 문서를 열 수 있는 텍스트 편집기) 또는 모달 (예: 응용 프로그램을 계속 하기 전에 해제 해야 하는 내보내기 대화 상자)에서 사용할 수 있습니다.Windows can be used in a Modeless state (such as a text editor that can have multiple documents open at once) or Modal (such as an Export dialog that must be dismissed before the application can continue).

패널은 일반적으로 응용 프로그램에서 보조 기능을 제공 하는 특수 한 종류의 창 (기본 NSWindow 클래스의 서브 클래스)으로, 일반적으로 응용 프로그램에서 보조 기능을 제공 합니다 (예: 텍스트 형식 검사기, 시스템 색 선택 등).Panels are a special kind of Window (a subclass of the base NSWindow class), that typically serve an auxiliary function in an application, such as utility windows like Text format inspectors and system Color Picker.

이 문서에서는 Xamarin.ios 응용 프로그램에서 Windows 및 패널로 작업 하는 기본 사항을 설명 합니다.In this article, we'll cover the basics of working with Windows and Panels in a Xamarin.Mac application. Hello, Mac 문서를 먼저 사용 하는 것이 가장 좋습니다. 특히 Xcode 및 Interface Builder콘센트 및 작업 섹션을 소개 하 고,에서 사용할 주요 개념 및 기술을 설명 하 고 있습니다. 이 문서를 참조 하세요.It is highly suggested that you work through the Hello, Mac article first, specifically the Introduction to Xcode and Interface Builder and Outlets and Actions sections, as it covers key concepts and techniques that we'll be using in this article.

Xamarin.ios 내부 문서의 목적에 따라 클래스/메서드 노출 C# 섹션을 살펴볼 수 있습니다. 여기에서는 C# 클래스를 목표에 연결 하는 데 사용 되는RegisterExport명령을 설명 합니다. 개체 및 UI 요소You may want to take a look at the Exposing C# classes / methods to Objective-C section of the Xamarin.Mac Internals document as well, it explains the Register and Export commands used to wire-up your C# classes to Objective-C objects and UI Elements.

Windows 소개Introduction to Windows

위에서 설명한 것 처럼 창에는 보기와 컨트롤을 배치 하 고 관리 하 고 키보드 또는 마우스를 통해 사용자 상호 작용에 따라 이벤트에 응답할 수 있는 영역이 제공 됩니다.As stated above, a Window provides an area in which Views and Controls can be placed and managed and responds to events based on user interaction (either via keyboard or mouse).

Apple에 따르면 macOS 앱에는 다음과 같은 5 가지 주요 유형의 창이 있습니다.According to Apple, there are five main types of Windows in a macOS App:

  • 문서 창 -문서 창에는 스프레드시트 또는 텍스트 문서와 같은 파일 기반 사용자 데이터가 포함 됩니다.Document Window - A document window contains file-based user data such as a spreadsheet or a text document.
  • 앱 창 -앱 창은 문서 기반이 아닌 응용 프로그램의 주 창입니다 (예: Mac의 일정 앱).App Window - An app window is the main window of an application that is not document-based (like the Calendar app on a Mac).
  • Panel -패널은 다른 창 위에 배치 되며, 문서가 열려 있는 동안 사용자가 작업할 수 있는 도구나 컨트롤을 제공 합니다.Panel - A panel floats above other windows and provides tools or controls that users can work with while documents are open. 일부 경우에는 패널이 클 수 있는 경우 (예: 커다란 그래픽으로 작업 하는 경우)In some cases, a panel can be translucent (such as when working with large graphics).
  • 대화 상자 -사용자 동작에 대 한 응답으로 대화 상자가 나타나고 일반적으로 사용자가 작업을 완료 하는 방법을 제공 합니다.Dialog - A dialog appears in response to a user action and typically provides ways users can complete the action. 대화 상자를 닫기 전에 사용자의 응답이 필요 합니다.A dialog requires a response from the user before it can be closed. ( 대화 작업참조)(See Working with Dialogs)
  • 경고 -경고는 심각한 문제 (예: 오류) 또는 경고 (예: 파일 삭제 준비)가 발생 한 경우 표시 되는 특별 한 유형의 대화 상자입니다.Alerts - An alert is a special type of dialog that appears when a serious problem occurs (such as an error) or as a warning (such as preparing to delete a file). 경고는 대화 상자 이므로 닫아야 하기 전에 사용자 응답이 필요 합니다.Because an alert is a dialog, it also requires a user response before it can be closed. ( 경고 작업참조)(See Working with Alerts)

자세한 내용은 Apple OS X 휴먼 인터페이스 지침Windows 정보 섹션을 참조 하세요.For more information, see the About Windows section of Apple's OS X Human Interface Guidelines

주, 키 및 비활성 창Main, Key, and Inactive Windows

Xamarin.ios 응용 프로그램의 Windows는 현재 사용자가 상호 작용 하는 방법에 따라 다르게 표시 및 동작할 수 있습니다.Windows in a Xamarin.Mac application can look and behave differently based on how the user is currently interacting with them. 현재 사용자의 주의에 초점을 맞춘 가장 많은 문서 또는 앱 창을 _주 창_이라고 합니다.The foremost Document or App Window that is currently focus of the user’s attention is called the Main Window. 대부분의 경우이 창은 키 창 (현재 사용자 입력을 수락 하는 창)도 됩니다.In most instances this Window will also be the Key Window (the window that is currently accepting user input). 그러나이는 항상 그렇지는 않습니다. 예를 들어 색 선택은 열려 있을 수 있으며, 사용자가 문서 창에서 항목의 상태를 변경 하기 위해 상호 작용 하는 키 창이 될 수 있습니다 (여전히 주 창이 됨).But this isn't always the case, for example, a Color Picker could be open and be the Key window that the user is interacting with to change the state of an item in the Document Window (which would still be the Main Window).

기본 및 키 창 (분리 된 경우)은 항상 활성 상태이 고 비활성 windows 는 전경에 있지 않은 열려 있는 창입니다.The Main and Key Windows (if they are separate) are always active, Inactive Windows are open windows that are not in the foreground. 예를 들어 텍스트 편집기 응용 프로그램은 한 번에 둘 이상의 문서를 열어 둘 수 있으며, 주 창만 활성화 되 고 다른 모든 항목은 비활성 상태가 됩니다.For example, a text editor application could have more than one document open at a time, only the Main Window would be active, all others would be inactive.

자세한 내용은 Apple OS X 휴먼 인터페이스 지침Windows 정보 섹션을 참조 하세요.For more information, see the About Windows section of Apple's OS X Human Interface Guidelines

창 이름 지정Naming Windows

창에서 제목 표시줄을 표시할 수 있으며 제목이 표시 되 면 일반적으로 응용 프로그램 이름, 작업 중인 문서 이름 또는 창 기능 (예: 검사기)입니다.A Window can display a Title Bar and when the Title is displayed, it's usually the name of the application, the name of the document being worked on or the function of the window (such as Inspector). 일부 응용 프로그램은 시야가 인식 되 고 문서에서 작동 하지 않기 때문에 제목 표시줄을 표시 하지 않습니다.Some applications don't display a Title Bar because they are recognizable by sight and don't work with documents.

Apple에서 다음 지침을 제안 합니다.Apple suggest the following guidelines:

  • 응용 프로그램 이름을 사용 하 여 문서를 사용 하지 않는 주 창의 제목을 사용 합니다.Use your application name for the title of a main, non-document window.
  • 새 문서 창 이름을 untitled합니다.Name a new document window untitled. 첫 번째 새 문서의 경우 제목에 숫자를 추가 하지 않습니다 (예: untitled 1).For the first new document, don't append a number to the Title (such as untitled 1). 사용자가 첫 번째 문서를 저장 하 고 제목 하기 전에 다른 새 문서를 만든 경우 해당 창을 untitled 2, untitled 3등으로 호출 합니다.If the user creates another new document before saving and titling the first, call that window untitled 2, untitled 3, etc.

자세한 내용은 Apple OS X 휴먼 인터페이스 지침Windows 이름 지정 섹션을 참조 하세요.For more information, see the Naming Windows section of Apple's OS X Human Interface Guidelines

전체 화면 창Full-Screen Windows

MacOS에서 응용 프로그램의 창은 전체 화면으로 이동 하 여 응용 프로그램 메뉴 모음 (커서를 화면 맨 위로 이동 하 여 표시 될 수 있음)을 표시 하 여 해당 콘텐츠와의 혼란 스 러 향상 된 기능을 제공 합니다.In macOS, an application's window can go full screen hiding everything including the Application Menu Bar (which can be revealed by moving the cursor to the top of the screen) to provide distraction free interaction with it's content.

Apple에서는 다음 지침을 제안 합니다.Apple suggests the following guidelines:

  • 창을 전체 화면으로 이동 하는 것이 적절 한지 여부를 결정 합니다.Determine whether it makes sense for a window to go full screen. 계산기와 같이 간략 한 상호 작용을 제공 하는 응용 프로그램은 전체 화면 모드를 제공 하지 않아야 합니다.Applications that provide brief interactions (such as a Calculator) shouldn't provide a full screen mode.
  • 전체 화면 작업에 필요한 경우 도구 모음을 표시 합니다.Show the toolbar if the full-screen task requires it. 일반적으로 도구 모음은 전체 화면 모드에서 숨겨집니다.Typically the toolbar is hidden while in full screen mode.
  • 전체 화면 창에는 사용자가 작업을 완료 하는 데 필요한 모든 기능이 있어야 합니다.The full-screen window should have all the features users need to complete the task.
  • 가능 하면 사용자가 전체 화면 창에 있는 동안 찾기 상호 작용을 방지 합니다.If possible, avoid Finder interaction while the user is in a full-screen window.
  • 주 작업에서 포커스를 벗어나 이동 하지 않고 늘어난 화면 공간을 활용 합니다.Take advantage of the increased screen space without shifting the focus away from the main task.

자세한 내용은 Apple OS X 휴먼 인터페이스 지침전체 화면 창 섹션을 참조 하세요.For more information, see the Full-Screen Windows section of Apple's OS X Human Interface Guidelines

패널Panels

패널은 활성 문서 또는 선택 (예: 시스템 색 선택)에 영향을 주는 컨트롤과 옵션을 포함 하는 보조 창입니다.A Panel is an auxiliary window that contains controls and options that affect the active document or selection (such as the system Color Picker):

패널은 앱 특정 _또는 전체를 사용할_수 있습니다.Panels can be either App-Specific or Systemwide. 앱 특정 패널은 응용 프로그램의 문서 창 맨 위에 고정 되어 있고 응용 프로그램이 백그라운드에 있을 때 사라집니다.App-Specific Panels float over the top of the application's document windows and disappear when the application is in the background. 응용 프로그램에 상관 없이 모든 시스템 패널 (예: 글꼴 패널)은 열려 있는 모든 창 위에 배치 됩니다.Systemwide Panels (such as the Fonts panel), float on top of all open windows no matter the application.

Apple에서는 다음 지침을 제안 합니다.Apple suggests the following guidelines:

  • 일반적으로 표준 패널을 사용 하 고 투명 패널은 그래픽을 많이 사용 하는 작업에만 사용 해야 합니다.In general, use a standard panel, transparent panels should only be used sparingly and for graphically intensive tasks.
  • 패널을 사용 하 여 사용자에 게 직접 작업에 영향을 주는 중요 한 컨트롤이 나 정보에 쉽게 액세스할 수 있도록 하는 것이 좋습니다.Consider using a panel to give users easy access to important controls or information that directly affects their task.
  • 필요에 따라 패널을 숨기 거 나 표시 합니다.Hide and show panels as required.
  • 패널은 항상 제목 표시줄을 포함 해야 합니다.Panels should always include title bar.
  • 패널은 활성 최소화 단추를 포함 하지 않아야 합니다.Panels should not include an active minimize button.

검사기Inspectors

최신 macOS 응용 프로그램은 패널 창을 사용 하는 대신 주 창에 포함 된 검사기 로 활성 문서 또는 선택 항목에 영향을 주는 보조 컨트롤 및 옵션을 제공 합니다 (예: 아래에 표시 된 페이지 앱).Most modern macOS applications present auxiliary controls and options that affect the active document or selection as Inspectors that are part of the Main Window (like the Pages app shown below), instead of using Panel Windows:

자세한 내용은 Xamarin.ios 앱에서 검사기 인터페이스 의 전체 구현을 위한 Apple OS X 휴먼 인터페이스 지침Macinspector 샘플 앱의 패널 섹션을 참조 하세요.For more information, see the Panels section of Apple's OS X Human Interface Guidelines and our MacInspector sample app for a full implementation of an Inspector Interface in a Xamarin.Mac app.

Xcode에서 Windows 만들기 및 유지 관리Creating and Maintaining Windows in Xcode

새 Xamarin.ios Cocoa 응용 프로그램을 만들면 기본적으로 표준 빈 창이 표시 됩니다.When you create a new Xamarin.Mac Cocoa application, you get a standard blank, window by default. 이 창은 프로젝트에 자동으로 포함 되는 .storyboard 파일에 정의 됩니다.This windows is defined in a .storyboard file automatically included in the project. Windows 디자인을 편집 하려면 솔루션 탐색기에서 Main.storyboard 파일을 두 번 클릭 합니다.To edit your windows design, in the Solution Explorer, double click the Main.storyboard file:

이렇게 하면 Xcode의 Interface Builder에서 창 디자인이 열립니다.This will open the window design in Xcode's Interface Builder:

특성 검사자에는 창을 정의 하 고 제어 하는 데 사용할 수 있는 몇 가지 속성이 있습니다.In the Attribute Inspector, there are several properties that you can use to define and control your window:

  • Title -창의 titlebar에 표시 되는 텍스트입니다.Title - This is the text that will be displayed in the window's titlebar.
  • 자동 저장 -위치 및 설정이 자동으로 저장 될 때 창의 ID를 지정할 때 사용 되는 입니다.Autosave - This is the key that will be used to ID the window when it's position and settings are automatically saved.
  • 제목 표시줄 -창에 제목 표시줄이 표시 됩니다.Title Bar - Does the window display a title bar.
  • 통합 제목 및 도구 모음 -창에 도구 모음이 포함 되어 있으면 제목 표시줄의 일부가 됩니다.Unified Title and Toolbar - If the window includes a Toolbar, should it be part of the title bar.
  • 전체 크기의 콘텐츠 보기 -창의 콘텐츠 영역을 제목 표시줄 아래에 지정할 수 있습니다.Full Sized Content View - Allows the content area of the window to be under the Title bar.
  • 그림자 -창에 그림자가 있습니다.Shadow - Does the window have a shadow.
  • 질감이 있는 질감 창은 효과 (예: vibrancy)를 사용할 수 있으며 본문에서 아무 곳 이나 끌어 이동할 수 있습니다.Textured - Textured windows can use effects (like vibrancy) and can be moved around by dragging anywhere on their body.
  • 닫기 -창에 닫기 단추가 있습니다.Close - Does the window have a close button.
  • 최소화 -창에 최소화 단추가 있습니다.Minimize - Does the window have a minimize button.
  • 크기 조정 -창에 크기 조정 컨트롤이 있습니다.Resize - Does the window have a resize control.
  • 도구 모음 단추 -창에는 숨기기/표시 도구 모음 단추가 있습니다.Toolbar Button - Does the window have a hide/show toolbar button.
  • 복원 가능한 -창의 위치 및 설정이 자동으로 저장 되 고 복원 됩니다.Restorable - Is the window's position and settings automatically saved and restored.
  • 시작 시 표시 -.xib 파일이 로드 될 때 자동으로 표시 되는 창입니다.Visible At Launch - Is the window automatically shown when the .xib file is loaded.
  • 비활성화 시 숨기기 -응용 프로그램이 백그라운드에 들어가면 창이 숨겨집니다.Hide On Deactivate - Is the window hidden when the application enters the background.
  • 닫힘 시 릴리스 -메모리를 닫을 때 메모리에서 제거 되는 창입니다.Release When Closed - Is the window purged from memory when it is closed.
  • 항상 표시 도구 설명-도구 설명이 계속 표시 됩니다.Always Display Tooltips - Are the tooltips constantly displayed.
  • 뷰 루프 다시 계산 -창을 그리기 전에 다시 계산 된 뷰 순서입니다.Recalculates View Loop - Is the view order recalculated before the window is drawn.
  • 공백, 처럼순환 -모두 해당 macos 환경에서 창이 작동 하는 방식을 정의 합니다.Spaces, Exposé and Cycling - All define how the window behaves in those macOS environments.
  • 전체 화면 -이 창이 전체 화면 모드로 전환 될 수 있는지 여부를 결정 합니다.Full Screen - Determines if this window can enter the full screen mode.
  • 애니메이션 -창에 사용할 수 있는 애니메이션의 유형을 제어 합니다.Animation - Controls the type of animation available for the window.
  • 모양 -창의 모양을 제어 합니다.Appearance - Controls the appearance of the window. 지금은 바다색이 하나 뿐입니다.For now there is only one appearance, Aqua.

자세한 내용은 Apple의 Windows 및 Nswindow 소개 설명서를 참조 하세요.See Apple's Introduction to Windows and NSWindow documentation for more details.

기본 크기 및 위치 설정Setting the Default Size and Location

창의 초기 위치를 설정 하 고 크기를 제어 하려면 크기 검사자로 전환 합니다.To set the initial position of your window and to control it's size, switch to the Size Inspector:

여기에서 창의 초기 크기를 설정 하 고, 최소 및 최대 크기를 지정 하 고, 화면에서 초기 위치를 설정 하 고, 창 둘레의 테두리를 제어할 수 있습니다.From here you can set the initial size of the window, give it a minimum and maximum size, set the initial location on the screen and control the borders around the window.

사용자 지정 주 창 컨트롤러 설정Setting a Custom Main Window Controller

UI 요소를 코드에 C# 노출 하는 작업 및 작업을 만들 수 있으려면 xamarin.ios 앱은 사용자 지정 창 컨트롤러를 사용 해야 합니다.To be able to create Outlets and Actions to expose UI elements to C# code, the Xamarin.Mac app will need to be using a Custom Window Controller.

다음을 수행합니다.Do the following:

  1. Xcode의 Interface Builder에서 앱의 스토리 보드를 엽니다.Open the app's Storyboard in Xcode's Interface Builder.

  2. Design Surface에서 NSWindowController를 선택 합니다.Select the NSWindowController in the Design Surface.

  3. Identity Inspector 뷰로 전환 하 고 클래스 이름으로 WindowController을 입력 합니다.Switch to the Identity Inspector view and enter WindowController as the Class Name:

  4. 변경 내용을 저장 하 고 동기화 할 Mac용 Visual Studio로 돌아갑니다.Save your changes and return to Visual Studio for Mac to sync.

  5. WindowController.cs 파일은 Mac용 Visual Studio의 솔루션 탐색기 에서 프로젝트에 추가 됩니다.A WindowController.cs file will be added to your Project in the Solution Explorer in Visual Studio for Mac:

  6. Xcode의 Interface Builder에서 Storyboard를 다시 엽니다.Reopen the Storyboard in Xcode's Interface Builder.

  7. WindowController.h 파일을 사용할 수 있습니다.The WindowController.h file will be available for use:

UI 요소 추가Adding UI Elements

창의 내용을 정의 하려면 라이브러리 검사기 에서 인터페이스 편집기로 컨트롤을 끌어 옵니다.To define the content of a window, drag controls from the Library Inspector onto the Interface Editor. Interface Builder를 사용 하 여 컨트롤을 만들고 사용 하는 방법에 대 한 자세한 내용은 Xcode 및 Interface Builder 소개 문서를 참조 하세요.Please see our Introduction to Xcode and Interface Builder documentation for more information about using Interface Builder to create and enable controls.

예를 들어 라이브러리 검사기 의 도구 모음을 인터페이스 편집기의 창으로 끌어 보겠습니다.As an example, let's drag a Toolbar from the Library Inspector onto the window in the Interface Editor:

다음으로 텍스트 뷰 를 끌고 크기를 조정 하 여 도구 모음 아래의 영역을 채웁니다.Next, drag in a Text View and size it to fill the area under the toolbar:

창 크기가 변경 되 면 텍스트 보기가 축소 되 고 증가 하도록 하기 때문에 제약 조건 편집기 로 전환 하 여 다음 제약 조건을 추가 하겠습니다.Since we want the Text View to shrink and grow as the window's size changes, let's switch to the Constraint Editor and add the following constraints:

편집기 위쪽에 있는 Red I-빔 For Red I-- 를 클릭 하 고 4 개의 제약 조건 추가를 클릭 하 여 텍스트 뷰에 지정 된 X, Y 좌표를 그대로 유지 하 고 창의 크기를 조정할 때 가로 및 세로로 가로 및 세로로 크기를 조정 합니다.By clicking the for Red I-Beams at the top of the editor and clicking Add 4 Constraints, we are telling the text view to stick to the given X,Y coordinates and grow or shrink horizontally and vertically as the window is resized.

마지막으로 콘센트 를 사용 하 여 코드에 텍스트 뷰 를 노출 합니다 (ViewController.h 파일을 선택 해야 함).Finally, let's expose the Text View to code using an Outlet (making sure to select the ViewController.h file):

변경 내용을 저장 하 고 다시 Mac용 Visual Studio로 전환 하 여 Xcode와 동기화 합니다.Save your changes and switch back to Visual Studio for Mac to sync with Xcode.

콘센트 및 작업을 사용 하는 방법에 대 한 자세한 내용은 유출 및 작업 설명서를 참조하세요.For more information about working with Outlets and Actions, please see our Outlet and Action documentation.

표준 창 워크플로Standard Window Workflow

Xamarin.ios 응용 프로그램에서 만들고 사용 하는 모든 창에 대 한 프로세스는 기본적으로 위에서 수행한 것과 동일 합니다.For any window that you create and work with in your Xamarin.Mac application, the process is basically the same as what we have just done above:

  1. 프로젝트에 자동으로 추가 되는 기본값이 아닌 새 창에는 새 창 정의를 프로젝트에 추가 합니다.For new windows that are not the default added automatically to your project, add a new window definition to the project. 이에 대해서는 아래에서 자세히 설명 합니다.This will be discussed in detail below.
  2. Main.storyboard 파일을 두 번 클릭 하 여 Xcode의 Interface Builder에서 편집할 창 디자인을 엽니다.Double-click the Main.storyboard file to open the window design for editing in Xcode's Interface Builder.
  3. 새 창을 사용자 인터페이스의 디자인으로 끌고 segue 를 사용 하 여 창을 주 창에 연결 합니다 (자세한 내용은 storyboard 사용 설명서의 segue 섹션 참조).Drag a new Window into the User Interface's design and hook the window into Main Window using Segues (for more information see the Segues section of our Working with Storyboards documentation).
  4. 특성 검사자크기 검사자에서 필요한 창 속성을 설정 합니다.Set any required window properties in the Attribute Inspector and the Size Inspector.
  5. 인터페이스를 빌드하고 특성 검사자에서 구성 하는 데 필요한 컨트롤을 끌어 옵니다.Drag in the controls required to build your interface and configure them in the Attribute Inspector.
  6. 크기 검사기 를 사용 하 여 UI 요소의 크기 조정을 처리 합니다.Use the Size Inspector to handle the resizing for your UI Elements.
  7. 콘센트작업을 통해 코드에 C# 창의 UI 요소를 노출 합니다.Expose the window's UI elements to C# code via Outlets and Actions.
  8. 변경 내용을 저장 하 고 다시 Mac용 Visual Studio로 전환 하 여 Xcode와 동기화 합니다.Save your changes and switch back to Visual Studio for Mac to sync with Xcode.

이제 기본 창이 만들어졌으므로 windows에서 작업할 때 Xamarin.ios 응용 프로그램에서 수행 하는 일반적인 프로세스를 살펴보겠습니다.Now that we have a basic window created, we'll look at the typical processes a Xamarin.Mac application does when working with windows.

기본 창 표시Displaying the Default Window

기본적으로 새 Xamarin.ios 응용 프로그램은 시작 될 때 MainWindow.xib 파일에 정의 된 창을 자동으로 표시 합니다.By default, a new Xamarin.Mac application will automatically display the window defined in the MainWindow.xib file when it is started:

위에서 해당 창의 디자인을 수정 했으므로 이제 기본 도구 모음과 텍스트 뷰 컨트롤을 포함 합니다.Since we modified the design of that window above, it now includes a default Toolbar and Text View control. Info.plist 파일의 다음 섹션은이 창을 표시 하는 작업을 담당 합니다.The following section in the Info.plist file is responsible for displaying this window:

인터페이스 드롭다운은 기본 앱 UI (이 경우 Main.storyboard)로 사용 될 Storyboard를 선택 하는 데 사용 됩니다.The Main Interface dropdown is used to select the Storyboard that will be used as the main app UI (in this case Main.storyboard).

표시 되는 주 창 (기본 보기와 함께)을 제어 하기 위해 뷰 컨트롤러가 프로젝트에 자동으로 추가 됩니다.A View Controller is automatically added to the project to control that Main Windows that is displayed (along with its primary View). 이 파일은 ViewController.cs 파일에 정의 되어 있으며, Identity InspectorInterface Builder의 파일 소유자 에 게 연결 됩니다.It is defined in the ViewController.cs file and attached to the File's Owner in Interface Builder under the Identity Inspector:

이 창의 경우에는 먼저를 열 때 untitled 제목을 사용 하 여 다음과 같이 ViewController.csViewWillAppear 메서드를 재정의 합니다.For our window, we'd like it to have a title of untitled when it first opens so let's override the ViewWillAppear method in the ViewController.cs to look like the following:

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

    // Set Window Title
    this.View.Window.Title = "untitled";
}

참고

뷰가 메모리로 로드 될 수 있지만 아직 완전히 인스턴스화되지 않았기 때문에 ViewDidLoad 메서드 대신 ViewWillAppear 메서드에서 창의 Title 속성 값을 설정 합니다.We are setting the value of the Window's Title property in the ViewWillAppear method instead of the ViewDidLoad method because, while the view might be loaded into memory, it is not yet fully instantiated. ViewDidLoad 메서드에서 Title 속성에 액세스 하려고 하면 창이 생성 되지 않았고 속성에 아직 연결 되지 않았기 때문에 null 예외가 발생 합니다.If we tried to access the Title property in the ViewDidLoad method we would get a null exception since the Window hasn't been constructed and wired-up to the property yet.

프로그래밍 방식으로 창 닫기Programmatically Closing a Window

사용자가 창의 닫기 단추를 클릭 하거나 메뉴 항목을 사용 하는 것 외에도 사용자가 xamarin.ios 응용 프로그램에서 창을 프로그래밍 방식으로 닫아야 하는 경우가 있을 수 있습니다.There might be times that you wish to programmatically close a window in a Xamarin.Mac application, other than having the user click the window's Close button or using a menu item. macOS는 PerformCloseClose``NSWindow를 프로그래밍 방식으로 닫는 두 가지 방법을 제공 합니다.macOS provides two different ways to close an NSWindow programmatically: PerformClose and Close.

PerformClosePerformClose

NSWindowPerformClose 메서드를 호출 하면 단추를 잠시 강조 표시 한 다음 창을 닫아 창의 닫기 단추를 클릭 하 여 사용자를 시뮬레이션 합니다.Calling the PerformClose method of an NSWindow simulates the user clicking the window's Close button by momentarily highlighting the button and then closing the window.

응용 프로그램이 NSWindowWillClose 이벤트를 구현 하는 경우 창이 닫힐 때까지 발생 합니다.If the application implements the NSWindow's WillClose event, it will be raised before the window is closed. 이벤트가 false반환 하는 경우 창이 닫히지 않습니다.If the event returns false, then the window will not be closed. 창에 닫기 단추가 없거나 어떤 이유로 든 닫을 수 없는 경우 OS가 경고 소리를 내보냅니다.If the window does not have a Close button or cannot be closed for any reason, the OS will emit the alert sound.

예를 들면,For example:

MyWindow.PerformClose(this);

MyWindow NSWindow 인스턴스를 닫으려고 시도 합니다.Would attempt to close the MyWindow NSWindow instance. 성공적으로 완료 되 면 창이 닫히고 경고 소리가 내보내지고가 열린 상태로 유지 됩니다.If it was successful, the window will be closed, else the alert sound will be emitted and the will stay open.

닫기Close

NSWindowClose 메서드를 호출 하면 단추를 일시적으로 강조 표시 하 여 창의 닫기 단추를 클릭 하면 창이 시뮬레이션 됩니다.Calling the Close method of an NSWindow does not simulates the user clicking the window's Close button by momentarily highlighting the button, it simply closes the window.

창을 닫을 때까지 표시 하지 않아도 되며, 창이 닫히는 동안 기본 알림 센터에 NSWindowWillCloseNotification 알림이 게시 됩니다.A window does not have to be visible to be closed and an NSWindowWillCloseNotification notification will be posted to the default Notification Center for the window being closed.

Close 메서드는 PerformClose 메서드와 중요 한 두 가지 방법으로 다릅니다.The Close method differs in two important ways from the PerformClose method:

  1. WillClose 이벤트를 발생 시 키 지 않습니다.It does not attempt to raise the WillClose event.
  2. 사용자가 단추를 일시적으로 강조 표시 하 여 닫기 단추를 클릭 하는 것을 시뮬레이션 하지 않습니다.It does not simulate the user clicking the Close button by momentarily highlighting the button.

예를 들면,For example:

MyWindow.Close();

MyWindow NSWindow 인스턴스를 닫습니다.Would to close the MyWindow NSWindow instance.

수정 된 Windows 콘텐츠Modified Windows Content

MacOS에서 Apple은 사용자가 창 내용 (NSWindow)을 수정 하 고 저장 해야 함을 사용자에 게 알리는 방법을 제공 합니다.In macOS, Apple has provided a way to inform the user that the contents of a Window (NSWindow) has been modified by the user and needs to be saved. 창에 수정 된 내용이 포함 되어 있는 경우 닫는 위젯에 작은 검정색 점이 표시 됩니다.If the Window contains modified content, a small black dot will be displayed in it's Close widget:

창의 내용에 저장 하지 않은 변경 내용이 있는 상태에서 사용자가 창을 닫거나 Mac 앱을 종료 하려는 경우에는 대화 상자 또는 모달 시트 를 표시 하 고 사용자가 변경 내용을 먼저 저장할 수 있도록 해야 합니다.If the user attempts to close the Window or quit the Mac App while there are unsaved changes to the Window's content, you should present a Dialog Box or Modal Sheet and allow the user to save their changes first:

창을 수정 된 것으로 표시Marking a Window as Modified

창을 수정 된 콘텐츠로 표시 하려면 다음 코드를 사용 합니다.To mark a Window as having modified content, use the following code:

// Mark Window content as modified
Window.DocumentEdited = true;

변경 내용을 저장 한 후에는 다음을 사용 하 여 수정 된 플래그를 지웁니다.And once the change has been saved, clear the modified flag using:

// Mark Window content as not modified
Window.DocumentEdited = false;

창을 닫기 전에 변경 내용 저장Saving Changes Before Closing a Window

사용자가 창을 닫고 수정 된 콘텐츠를 미리 저장할 수 있도록 허용 하려면 NSWindowDelegate의 서브 클래스를 만들고 WindowShouldClose 메서드를 재정의 해야 합니다.To watch for the user closing a Window and allowing them to save modified content beforehand, you will need to create a subclass of NSWindowDelegate and override its WindowShouldClose method. 예를 들면,For example:

using System;
using AppKit;
using System.IO;
using Foundation;

namespace SourceWriter
{
    public class EditorWindowDelegate : NSWindowDelegate
    {
        #region Computed Properties
        public NSWindow Window { get; set;}
        #endregion

        #region constructors
        public EditorWindowDelegate (NSWindow window)
        {
            // Initialize
            this.Window = window;

        }
        #endregion

        #region Override Methods
        public override bool WindowShouldClose (Foundation.NSObject sender)
        {
            // is the window dirty?
            if (Window.DocumentEdited) {
                var alert = new NSAlert () {
                    AlertStyle = NSAlertStyle.Critical,
                    InformativeText = "Save changes to document before closing window?",
                    MessageText = "Save Document",
                };
                alert.AddButton ("Save");
                alert.AddButton ("Lose Changes");
                alert.AddButton ("Cancel");
                var result = alert.RunSheetModal (Window);

                // Take action based on result
                switch (result) {
                case 1000:
                    // Grab controller
                    var viewController = Window.ContentViewController as ViewController;

                    // Already saved?
                    if (Window.RepresentedUrl != null) {
                        var path = Window.RepresentedUrl.Path;

                        // Save changes to file
                        File.WriteAllText (path, viewController.Text);
                        return true;
                    } else {
                        var dlg = new NSSavePanel ();
                        dlg.Title = "Save Document";
                        dlg.BeginSheet (Window, (rslt) => {
                            // File selected?
                            if (rslt == 1) {
                                var path = dlg.Url.Path;
                                File.WriteAllText (path, viewController.Text);
                                Window.DocumentEdited = false;
                                viewController.View.Window.SetTitleWithRepresentedFilename (Path.GetFileName(path));
                                viewController.View.Window.RepresentedUrl = dlg.Url;
                                Window.Close();
                            }
                        });
                        return true;
                    }
                    return false;
                case 1001:
                    // Lose Changes
                    return true;
                case 1002:
                    // Cancel
                    return false;
                }
            }

            return true;
        }
        #endregion
    }
}

이 대리자의 인스턴스를 창에 연결 하려면 다음 코드를 사용 합니다.Use the following code to attach an instance of this delegate to your window:

// Set delegate
Window.Delegate = new EditorWindowDelegate(Window);

앱을 닫기 전에 변경 내용 저장Saving Changes Before Closing the App

마지막으로, Xamarin.ios 앱은 해당 창에 수정 된 내용이 포함 되어 있는지 확인 하 고 사용자가 변경 내용을 저장 하도록 허용 하 여 종료 합니다.Finally, your Xamarin.Mac App should check to see if any of its Windows contain modified content and allow the user to save the changes before quitting. 이렇게 하려면 AppDelegate.cs 파일을 편집 하 고 ApplicationShouldTerminate 메서드를 재정의 하 여 다음과 같이 만듭니다.To do this, edit your AppDelegate.cs file, override the ApplicationShouldTerminate method and make it look like the following:

public override NSApplicationTerminateReply ApplicationShouldTerminate (NSApplication sender)
{
    // See if any window needs to be saved first
    foreach (NSWindow window in NSApplication.SharedApplication.Windows) {
        if (window.Delegate != null && !window.Delegate.WindowShouldClose (this)) {
            // Did the window terminate the close?
            return NSApplicationTerminateReply.Cancel;
        }
    }

    // Allow normal termination
    return NSApplicationTerminateReply.Now;
}

여러 창에서 작업Working with Multiple Windows

대부분의 문서 기반 Mac 응용 프로그램은 여러 문서를 동시에 편집할 수 있습니다.Most document based Mac applications can edit multiple documents at the same time. 예를 들어 텍스트 편집기에서 동시에 편집을 위해 여러 텍스트 파일을 열어 둘 수 있습니다.For example, a text editor can have multiple text files open for edit at the same time. 기본적으로 새 Xamarin.ios 응용 프로그램에는 항목이 자동으로 newDocument: 작업에 연결 된 파일 메뉴가 있습니다.By default, our new Xamarin.Mac application has a File menu with a New item automatically wired-up to the newDocument: Action.

이 새 항목을 활성화 하 고 사용자가 주 창의 여러 복사본을 열어 여러 문서를 한 번에 편집할 수 있도록 합니다.We are going to activate this new item and allow the user to open multiple copies of our Main Window to edit multiple documents at once.

AppDelegate.cs 파일을 편집 하 고 다음 계산 된 속성을 추가 해 보겠습니다.Let's edit our AppDelegate.cs file and add the following computed property:

public int UntitledWindowCount { get; set;} =1;

이는 사용자에 게 피드백을 제공할 수 있도록 저장 되지 않은 파일 수를 추적 하는 데 사용 됩니다 (위에서 설명한 대로 Apple의 지침에 따라).We'll use this to track the number of unsaved files so we can give feedback to the user (per Apple's guidelines as discussed above).

다음에는 다음 메서드를 추가 합니다.Next, add the following method:

[Export ("newDocument:")]
void NewDocument (NSObject sender) {
    // Get new window
    var storyboard = NSStoryboard.FromName ("Main", null);
    var controller = storyboard.InstantiateControllerWithIdentifier ("MainWindow") as NSWindowController;

    // Display
    controller.ShowWindow(this);

    // Set the title
    controller.Window.Title = (++UntitledWindowCount == 1) ? "untitled" : string.Format ("untitled {0}", UntitledWindowCount);
}

이 코드는 창 컨트롤러의 새 버전을 만들고, 새 창을 로드 하 고, 기본 및 키 창으로 설정 하 고, 제목으로 설정 합니다.This code creates a new version of our Window Controller, loads the new Window, makes it the Main and Key Window, and sets it title. 이제 응용 프로그램을 실행 하 고 파일 메뉴에서 새로 만들기 를 선택 하면 새 편집기 창이 열리고 표시 됩니다.Now if we run our application, and select New from the File menu a new editor window will be opened and displayed:

Windows 메뉴를 열면 응용 프로그램에서 열려 있는 창을 자동으로 추적 하 고 처리 하는 것을 볼 수 있습니다.If we open the Windows menu, you can see the application is automatically tracking and handling our open windows:

Xamarin.ios 응용 프로그램에서 메뉴를 사용 하는 방법에 대 한 자세한 내용은 메뉴 작업 설명서를 참조 하세요.For more information on working with Menus in a Xamarin.Mac application, please see our Working with Menus documentation.

현재 활성 창 가져오기Getting the Currently Active Window

여러 창 (문서)을 열 수 있는 Xamarin.ios 응용 프로그램에서 현재 최상위 창 (키 창)을 가져와야 하는 경우가 있습니다.In a Xamarin.Mac application that can open multiple windows (documents), there are times when you will need to get the current, topmost window (the key window). 다음 코드에서는 키 창을 반환 합니다.The following code will return the key window:

var window = NSApplication.SharedApplication.KeyWindow;

현재 키 창에 액세스 해야 하는 모든 클래스 또는 메서드에서 호출 될 수 있습니다.It can be called in any class or method that needs to access the current, key window. 현재 열려 있는 창이 없으면 null반환 됩니다.If no window is currently open, it will return null.

모든 앱 창에 액세스Accessing All App Windows

Xamarin.ios 앱이 현재 열려 있는 모든 창에 액세스 해야 하는 경우가 있을 수 있습니다.There might be times where you need to access all of the windows that your Xamarin.Mac app currently has open. 예를 들어 사용자가 열려는 파일이 종료 창에 이미 열려 있는지 여부를 확인 합니다.For example, to see if a file that the user wants to open is already open in an exiting window.

NSApplication.SharedApplication는 앱에서 열려 있는 모든 창의 배열을 포함 하는 Windows 속성을 유지 관리 합니다.The NSApplication.SharedApplication maintains a Windows property that contains an array of all open windows in your app. 이 배열을 반복 하 여 모든 응용 프로그램의 현재 창에 액세스할 수 있습니다.You can iterate over this array to access all of the app's current windows. 예를 들면,For example:

// Is the file already open?
for(int n=0; n<NSApplication.SharedApplication.Windows.Length; ++n) {
    var content = NSApplication.SharedApplication.Windows[n].ContentViewController as ViewController;
    if (content != null && path == content.FilePath) {
        // Bring window to front
        NSApplication.SharedApplication.Windows[n].MakeKeyAndOrderFront(this);
        return true;
    }
}

예제 코드에서는 반환 된 각 창을 앱의 사용자 지정 ViewController 클래스로 캐스팅 하 고 사용자가 열려는 파일의 경로에 대해 사용자 지정 Path 속성의 값을 테스트 합니다.In the example code we are casting each returned window to the custom ViewController class in our app and the testing the value of a custom Path property against the path of a file the user wants to open. 파일이 이미 열려 있는 경우 해당 창을 맨 앞으로 가져오는 것입니다.If the file is already open, we are bringing that window to the front.

코드에서 창 크기 조정Adjusting the Window Size in Code

응용 프로그램에서 코드의 창 크기를 조정 해야 하는 경우가 있습니다.There are times when the application needs to resize a window in code. 창의 크기를 조정 하 고 위치를 변경 하려면 Frame 속성을 조정 합니다.To resize and reposition a window, you adjust it's Frame property. 창 크기를 조정할 때는 일반적으로 macOS 좌표계로 인해 창을 동일한 위치에 유지 하기 위해 원본도 조정 해야 합니다.When adjusting a window's size, you usually need to also adjust it's origin, to keep the window in the same location because of macOS's coordinate system.

왼쪽 위 모퉁이가 (0, 0)를 나타내는 iOS와 달리 macOS는 화면의 왼쪽 아래 모퉁이가 (0, 0)를 나타내는 수학 좌표계를 사용 합니다.Unlike iOS where the upper left hand corner represents (0,0), macOS uses a mathematic coordinate system where the lower left hand corner of the screen represents (0,0). IOS에서 좌표는 오른쪽 아래로 이동할 때 증가 합니다.In iOS the coordinates increase as you move downward towards the right. MacOS에서 좌표는 오른쪽의 값을 늘립니다.In macOS, the coordinates increase in value upwards to the right.

다음 예제 코드에서는 창의 크기를 조정 합니다.The following example code resizes a window:

nfloat y = 0;

// Calculate new origin
y = Frame.Y - (768 - Frame.Height);

// Resize and position window
CGRect frame = new CGRect (Frame.X, y, 1024, 768);
SetFrame (frame, true);

중요

코드에서 windows 크기와 위치를 조정 하는 경우 Interface Builder에 설정 된 최소 및 최대 크기를 준수 하는지 확인 해야 합니다.When you adjust a windows size and location in code, you need to make sure you respect the minimum and maximum sizes that you have set in Interface Builder. 이는 자동으로 적용 되지 않으며 창을 이러한 제한 보다 크거나 작게 만들 수 있습니다.This will not be automatically honored and you will be able to make the window bigger or smaller than these limits.

모니터링 창 크기 변경Monitoring Window Size Changes

Xamarin.ios 앱 내에서 창의 크기 변경을 모니터링 해야 하는 경우가 있을 수 있습니다.There might be times where you need to monitor changes in a Window's size inside of your Xamarin.Mac app. 예를 들어 새 크기에 맞게 콘텐츠를 다시 그리도록 합니다.For example, to redraw content to fit the new size.

크기 변경을 모니터링 하려면 먼저 Xcode의 Interface Builder 창 컨트롤러에 대 한 사용자 지정 클래스를 할당 했는지 확인 합니다.To monitor size changes, first ensure that you have assigned a custom class for the Window Controller in Xcode's Interface Builder. 예를 들어 다음 MasterWindowController 합니다.For example, MasterWindowController in the following:

그런 다음 사용자 지정 창 컨트롤러 클래스를 편집 하 고 컨트롤러의 창에서 DidResize 이벤트를 모니터링 하 여 라이브 크기 변경에 대 한 알림이 표시 되도록 합니다.Next, edit the custom Window Controller class and monitor the DidResize event on the Controller's Window to be notified of live size changes. 예를 들면,For example:

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

    Window.DidResize += (sender, e) => {
        // Do something as the window is being live resized
    };
}

필요에 따라 사용자가 창의 크기 변경을 완료 한 후에만 DidEndLiveResize 이벤트를 사용 하 여 알릴 수 있습니다.Optionally, you can use the DidEndLiveResize event to only be notified after the user has finished changing the Window's size. 예를 들면 다음과 같습니다.For Example:

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

        Window.DidEndLiveResize += (sender, e) => {
        // Do something after the user's finished resizing
        // the window
    };
}

창의 제목 및 표시 된 파일 설정Setting a Window’s Title and Represented File

문서를 나타내는 창에서 작업 하는 경우 NSWindow에는 DocumentEdited 속성이 있습니다 .이 속성을 true로 설정 하면 닫기 단추에 작은 점이 표시 되어 사용자에 게 파일이 수정 되었음을 표시 하 고 닫기 전에 저장 해야 합니다.When working with windows that represent documents, NSWindow has a DocumentEdited property that if set to true displays a small dot in the Close Button to give the user an indication that the file has been modified and should be saved before closing.

ViewController.cs 파일을 편집 하 고 다음과 같이 변경 하겠습니다.Let's edit our ViewController.cs file and make the following changes:

public bool DocumentEdited {
    get { return View.Window.DocumentEdited; }
    set { View.Window.DocumentEdited = value; }
}
...

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

    // Set Window Title
    this.View.Window.Title = "untitled";

    View.Window.WillClose += (sender, e) => {
        // is the window dirty?
        if (DocumentEdited) {
            var alert = new NSAlert () {
                AlertStyle = NSAlertStyle.Critical,
                InformativeText = "We need to give the user the ability to save the document here...",
                MessageText = "Save Document",
            };
            alert.RunModal ();
        }
    };
}

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

    // Show when the document is edited
    DocumentEditor.TextDidChange += (sender, e) => {
        // Mark the document as dirty
        DocumentEdited = true;
    };

    // Overriding this delegate is required to monitor the TextDidChange event
    DocumentEditor.ShouldChangeTextInRanges += (NSTextView view, NSValue[] values, string[] replacements) => {
        return true;
    };

}

또한 창에서 WillClose 이벤트를 모니터링 하 고 DocumentEdited 속성의 상태를 확인 합니다.We are also monitoring the WillClose event on the window and checking the state of the DocumentEdited property. true 경우에는 파일에 대 한 변경 내용을 저장 하는 기능을 사용자에 게 제공 해야 합니다.If it is true we need to give the user the ability to save the changes to the file. 앱을 실행 하 고 일부 텍스트를 입력 하면 점이 표시 됩니다.If we run our app and enter some text, the dot will be displayed:

창을 닫으려고 하면 다음과 같은 경고 메시지가 표시 됩니다.If we try to close the window, we get an alert:

파일에서 문서를 로드 하는 경우 window.SetTitleWithRepresentedFilename (Path.GetFileName(path)); 메서드를 사용 하 여 창의 제목을 파일 이름으로 설정할 수 있습니다. path은 열 파일을 나타내는 문자열입니다.If we are loading a document from a file we can set the title of the window to the file's name using the window.SetTitleWithRepresentedFilename (Path.GetFileName(path)); method (given that path is a string representing the file being opened). 또한 window.RepresentedUrl = url; 메서드를 사용 하 여 파일의 URL을 설정할 수 있습니다.Additionally, we can set the URL of the file using the window.RepresentedUrl = url; method.

URL이 OS에서 알려진 파일 형식을 가리키는 경우 해당 아이콘이 제목 표시줄에 표시 됩니다.If the URL is pointing to a file type known by the OS, it's icon will be displayed in the title bar. 사용자가 아이콘을 마우스 오른쪽 단추로 클릭 하면 파일 경로가 표시 됩니다.If the user right clicks on the icon, the path to the file will be shown.

AppDelegate.cs 파일을 편집 하 고 다음 메서드를 추가 해 보겠습니다.Let's edit the AppDelegate.cs file and add the following method:

[Export ("openDocument:")]
void OpenDialog (NSObject sender)
{
    var dlg = NSOpenPanel.OpenPanel;
    dlg.CanChooseFiles = true;
    dlg.CanChooseDirectories = false;

    if (dlg.RunModal () == 1) {
        // Nab the first file
        var url = dlg.Urls [0];

        if (url != null) {
            var path = url.Path;

            // Get new window
            var storyboard = NSStoryboard.FromName ("Main", null);
            var controller = storyboard.InstantiateControllerWithIdentifier ("MainWindow") as NSWindowController;

            // Display
            controller.ShowWindow(this);

            // Load the text into the window
            var viewController = controller.Window.ContentViewController as ViewController;
            viewController.Text = File.ReadAllText(path);
                    viewController.View.Window.SetTitleWithRepresentedFilename (Path.GetFileName(path));
            viewController.View.Window.RepresentedUrl = url;

        }
    }
}

이제 앱을 실행 하는 경우 파일 메뉴에서 열기 ... 를 선택 하 고 열기 대화 상자에서 텍스트 파일을 선택 하 여 엽니다.Now if we run our app, select Open... from the File menu, select a text file from the Open Dialog box and open it:

파일이 표시 되 고 제목은 파일의 아이콘을 사용 하 여 설정 됩니다.The file will be displayed and the title will be set with the icon of the file:

프로젝트에 새 창 추가Adding a New Window to a Project

기본 문서 창 외에도 Xamarin.ios 응용 프로그램은 기본 설정 또는 검사기 패널과 같은 다른 형식의 창을 사용자에 게 표시 해야 할 수 있습니다.Aside from the main document window, a Xamarin.Mac application might need to display other types of windows to the user, such as Preferences or Inspector Panels.

새 창을 추가 하려면 다음을 수행 합니다.To add a new window, do the following:

  1. 솔루션 탐색기에서 Main.storyboard 파일을 두 번 클릭 하 여 Xcode의 Interface Builder에서 편집할 수 있도록 엽니다.In the Solution Explorer, double-click the Main.storyboard file to open it for editing in Xcode's Interface Builder.

  2. 라이브러리 에서 새 창 컨트롤러 를 끌어 Design Surface에 놓습니다.Drag a new Window Controller from the Library and drop it on the Design Surface:

  3. Identity Inspector에서 Storyboard id에 대 한 PreferencesWindow를 입력 합니다.In the Identity Inspector, enter PreferencesWindow for the Storyboard ID:

  4. 인터페이스 디자인:Design your interface:

  5. 앱 메뉴 (MacWindows)를 열고, 기본 설정 ... 을 선택 하 고, 컨트롤을 클릭 한 다음 새 창으로 끕니다.Open the App Menu (MacWindows), select Preferences..., Control-Click and drag to the new window:

  6. 팝업 메뉴에서 표시 를 선택 합니다.Select Show from the popup menu.

  7. 변경 내용을 저장 하 고 Xcode와 동기화 할 Mac용 Visual Studio로 돌아갑니다.Save your changes and return to Visual Studio for Mac to sync with Xcode.

응용 프로그램 메뉴에서 코드를 실행 하 고 기본 설정 ... 을 선택 하는 경우 창이 표시 됩니다.If we run the code and select the Preferences... from the Application Menu, the window will be displayed:

패널 작업Working with Panels

이 문서의 시작 부분에서 설명한 것 처럼 패널은 다른 창 위에 배치 되며, 문서가 열려 있는 동안 사용자가 작업할 수 있는 도구나 컨트롤을 제공 합니다.As stated at the start of this article, a panel floats above other windows and provides tools or controls that users can work with while documents are open.

Xamarin.ios 응용 프로그램에서 만들고 사용 하는 다른 유형의 창과 마찬가지로 프로세스는 기본적으로 동일 합니다.Just like any other type of window that you create and work with in your Xamarin.Mac application, the process is basically the same:

  1. 새 창 정의를 프로젝트에 추가 합니다.Add a new window definition to the project.
  2. .xib 파일을 두 번 클릭 하 여 Xcode의 Interface Builder에서 편집할 창 디자인을 엽니다.Double-click the .xib file to open the window design for editing in Xcode's Interface Builder.
  3. 특성 검사자크기 검사자에서 필요한 창 속성을 설정 합니다.Set any required window properties in the Attribute Inspector and the Size Inspector.
  4. 인터페이스를 빌드하고 특성 검사자에서 구성 하는 데 필요한 컨트롤을 끌어 옵니다.Drag in the controls required to build your interface and configure them in the Attribute Inspector.
  5. 크기 검사기 를 사용 하 여 UI 요소의 크기 조정을 처리 합니다.Use the Size Inspector to handle the resizing for your UI Elements.
  6. 콘센트작업을 통해 코드에 C# 창의 UI 요소를 노출 합니다.Expose the window's UI elements to C# code via Outlets and Actions.
  7. 변경 내용을 저장 하 고 다시 Mac용 Visual Studio로 전환 하 여 Xcode와 동기화 합니다.Save your changes and switch back to Visual Studio for Mac to sync with Xcode.

특성 검사자의 패널에는 다음과 같은 옵션이 있습니다.In the Attribute Inspector, you have the following options specific to Panels:

  • 스타일 -패널의 스타일을 다음과 같이 조정할 수 있습니다. 일반 패널 (표준 창 처럼 보임), 유틸리티 패널 (더 작은 제목 표시줄 있음), HUD 패널 (반투명, 제목 표시줄은 배경의 일부).Style - Allow you to adjust the style of the panel from: Regular Panel (looks like a standard window), Utility Panel (has a smaller Title bar), HUD Panel (is translucent and the title bar is part of the background).
  • 활성화 되지 않음 -패널의 키 창이 됩니다.Non Activating - Determines in the panel becomes the key window.
  • 문서 모달 -문서 모달 인 경우 패널은 응용 프로그램 창 위에만 고정 되 고, 다른 창에는 부동으로 배치 됩니다.Document Modal - If Document Modal, the panel will only float above the application's windows, else it floats above all.

새 패널을 추가 하려면 다음을 수행 합니다.To add a new Panel, do the following:

  1. 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭 하 고 추가 > 새 파일...을 선택 합니다.In the Solution Explorer, right-click on the Project and select Add > New File...

  2. 새 파일 대화 상자에서 컨트롤러를 사용 하 여 xamarin.ios > cocoa 창을 선택 합니다.In the New File dialog box, select Xamarin.Mac > Cocoa Window with Controller:

  3. 이름에 대해 DocumentPanel를 입력하고 새로 만들기 단추를 클릭합니다.Enter DocumentPanel for the Name and click the New button.

  4. DocumentPanel.xib 파일을 두 번 클릭 하 여 Interface Builder에서 편집할 수 있도록 엽니다.Double-click the DocumentPanel.xib file to open it for editing in Interface Builder:

  5. 기존 창을 삭제 하 고 인터페이스 편집기에서 라이브러리 검사기 의 패널을 끕니다.Delete the existing Window and drag a Panel from the Library Inspector in the Interface Editor:

  6. 패널을 파일의 소유자 - 에 연결 - 콘센트에 연결 합니다.Hook the panel up to the File's Owner - window - Outlet:

  7. Id 검사자 로 전환 하 고 패널의 클래스를 DocumentPanel설정 합니다.Switch to the Identity Inspector and set the Panel's class to DocumentPanel:

  8. 변경 내용을 저장 하 고 Xcode와 동기화 할 Mac용 Visual Studio로 돌아갑니다.Save your changes and return to Visual Studio for Mac to sync with Xcode.

  9. DocumentPanel.cs 파일을 편집 하 고 클래스 정의를 다음과 같이 변경 합니다.Edit the DocumentPanel.cs file and change the class definition to the following:

    public partial class DocumentPanel : NSPanel

  10. 파일의 변경 내용을 저장합니다.Save the changes to the file.

AppDelegate.cs 파일을 편집 하 고 DidFinishLaunching 메서드를 다음과 같이 만듭니다.Edit the AppDelegate.cs file and make the DidFinishLaunching method look like the following:

public override void DidFinishLaunching (NSNotification notification)
{
        // Display panel
    var panel = new DocumentPanelController ();
    panel.Window.MakeKeyAndOrderFront (this);
}

응용 프로그램을 실행 하는 경우 패널이 표시 됩니다.If we run our application, the panel will be displayed:

중요

패널 창은 Apple에서 더 이상 사용 되지 않으므로 검사기 인터페이스로바꾸어야 합니다.Panel Windows have been deprecated by Apple and should be replaced with Inspector Interfaces. Xamarin.ios 앱에서 검사기 를 만드는 전체 예제는 macinspector 샘플 앱을 참조 하세요.For a full example of creating an Inspector in a Xamarin.Mac app, please see our MacInspector sample app.

요약Summary

이 문서에서는 Xamarin.ios 응용 프로그램에서 창과 패널을 사용 하는 방법에 대해 자세히 살펴봅니다.This article has taken a detailed look at working with Windows and Panels in a Xamarin.Mac application. Xcode의 Interface Builder에서 창과 패널을 만들고 유지 관리 하는 방법 및 코드에서 C# 창과 패널을 사용 하는 방법에 대 한 다양 한 형식 및 사용 방법을 살펴보았습니다.We saw the different types and uses of Windows and Panels, how to create and maintain Windows and Panels in Xcode's Interface Builder and how to work with Windows and Panels in C# code.