데이터 바인딩 및 Xamarin.Mac 키-값 코딩Data binding and key-value coding in Xamarin.Mac

이 문서에서는 키-값 코딩 및 Xcode의 Interface Builder에서 UI 요소에 데이터 바인딩할 수 있도록 관찰 키-값을 사용 하 여 설명 합니다.This article covers using key-value coding and key-value observing to allow for data binding to UI elements in Xcode's Interface Builder.

개요Overview

Xamarin.Mac 응용 프로그램에서 C# 및.NET을 사용 하 여 작업을 하는 경우 동일한 키-값 코딩 및 데이터 바인딩 기술에 액세스할 수 있습니다 하에서 작업을 수행할 Objective-cXcode 않습니다.When working with C# and .NET in a Xamarin.Mac application, you have access to the same key-value coding and data binding techniques that a developer working in Objective-C and Xcode does. Xcode의 Xamarin.Mac이 Xcode와 직접 통합 되므로 사용할 수 있습니다 Interface Builder 코드를 작성 하는 대신 UI 요소를 사용 하 여 데이터를 바인딩합니다.Because Xamarin.Mac integrates directly with Xcode, you can use Xcode's Interface Builder to Data Bind with UI elements instead of writing code.

키-값 코딩 및 바인딩 기술 Xamarin.Mac 응용 프로그램에서 데이터를 사용 하 여 작성 하 고 채우는 UI 요소를 사용 하 여 작업을 유지 해야 하는 코드의 양을 크게 줄일 수 있습니다.By using key-value coding and data binding techniques in your Xamarin.Mac application, you can greatly decrease the amount of code that you have to write and maintain to populate and work with UI elements. 추가 백업 데이터를 분리의 장점은 수도 있습니다 (데이터 모델)에 처음부터 사용자 인터페이스를 종료 합니다 (모델-뷰-컨트롤러)를 더 쉬워진 유지 관리를 보다 융통성 있는 응용 프로그램 디자인 합니다.You also have the benefit of further decoupling your backing data (Data Model) from your front end User Interface (Model-View-Controller), leading to easier to maintain, more flexible application design.

실행 중인 앱의 예가An example of the running app

이 문서에서는 Xamarin.Mac 응용 프로그램의 데이터 바인딩 및 키-값 코딩 작업의 기본 사항을 설명 합니다.In this article, we'll cover the basics of working with key-value coding and data binding 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.

참조 하려는 경우는 노출 C# 클래스 / Objective-c 하는 메서드를 의 섹션은 Xamarin.Mac 내부 설명도 문서는 RegisterExport 특성 요소 Objective-C 개체 및 UI에 C# 클래스를 연결 하는 데 사용 합니다.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 attributes used to wire up your C# classes to Objective-C objects and UI elements.

키-값 코딩 하는 것이 무엇입니까What is key-value coding

개체의 속성을 직접 액세스, 인스턴스 변수를 통해 액세스 하는 대신 속성을 식별 (특별 한 형식의 문자열) 키 또는 접근자 메서드를 사용 하는 메커니즘은 키-값 코딩 (KVC) (get/set).Key-value coding (KVC) is a mechanism for accessing an object’s properties indirectly, using keys (specially formatted strings) to identify properties instead of accessing them through instance variables or accessor methods (get/set). Xamarin.Mac 응용 프로그램에서 키-값 코딩 규격 접근자를 구현, 키-값 관찰 (KVO), 데이터 바인딩, 핵심 데이터, Cocoa 바인딩 및 스크립팅 등과 같은 다른 macOS (OS X 이전의 함) 기능에 대 한 액세스를 얻을 수 있습니다.By implementing key-value coding compliant accessors in your Xamarin.Mac application, you gain access to other macOS (formerly known as OS X) features such as key-value observing (KVO), data binding, Core Data, Cocoa bindings, and scriptability.

키-값 코딩 및 바인딩 기술 Xamarin.Mac 응용 프로그램에서 데이터를 사용 하 여 작성 하 고 채우는 UI 요소를 사용 하 여 작업을 유지 해야 하는 코드의 양을 크게 줄일 수 있습니다.By using key-value coding and data binding techniques in your Xamarin.Mac application, you can greatly decrease the amount of code that you have to write and maintain to populate and work with UI elements. 추가 백업 데이터를 분리의 장점은 수도 있습니다 (데이터 모델)에 처음부터 사용자 인터페이스를 종료 합니다 (모델-뷰-컨트롤러)를 더 쉬워진 유지 관리를 보다 융통성 있는 응용 프로그램 디자인 합니다.You also have the benefit of further decoupling your backing data (Data Model) from your front end User Interface (Model-View-Controller), leading to easier to maintain, more flexible application design.

예를 들어 KVC 호환 개체의 다음 클래스 정의 살펴보겠습니다.For example, let's look at the following class definition of a KVC compliant object:

using System;
using Foundation;

namespace MacDatabinding
{
    [Register("PersonModel")]
    public class PersonModel : NSObject
    {
        private string _name = "";
        
        [Export("Name")]
        public string Name {
            get { return _name; }
            set {
                WillChangeValue ("Name");
                _name = value;
                DidChangeValue ("Name");
            }
        }
        
        public PersonModel ()
        {
        }
    }
}

첫 번째는 [Register("PersonModel")] 특성 클래스를 등록 하 고 목표 C에 노출First, the [Register("PersonModel")] attribute registers the class and exposes it to Objective-C. 그런 다음 클래스에서 상속 해야 NSObject (또는 하위 클래스에서 상속 되는 NSObject), 여러 기본 클래스에 KVC 호환 되도록 허용 하는 메서드 추가 합니다.Then, the class needs to inherit from NSObject (or a subclass that inherits from NSObject), this adds several base method that allow to the class to be KVC compliant. 다음으로 [Export("Name")] 노출 특성을 Name 속성 KVC 및 KVO 기술을 통해 속성에 액세스 하려면 나중에 사용할 키 값을 정의 합니다.Next, the [Export("Name")] attribute exposes the Name property and defines the Key value that will later be used to access the property through KVC and KVO techniques.

마지막으로 관찰 된 키-값 속성의 값으로 변경 수 있으려면, 접근자 래핑해야 해당 값의 변경 WillChangeValue 하 고 DidChangeValue 메서드 호출 (동일한 키로 지정 하는 Export 특성).Finally, to be able to be Key-Value Observed changes to the property's value, the accessor must wrap changes to its value in WillChangeValue and DidChangeValue method calls (specifying the same Key as the Export attribute). 예를 들어:For example:

set {
    WillChangeValue ("Name");
    _name = value;
    DidChangeValue ("Name");
}

이 단계는 매우 Xcode에서 데이터 바인딩에 대 한 중요 한의 Interface Builder (보듯이이 문서의 뒷부분에서).This step is very important for data binding in Xcode's Interface Builder (as we will see later in this article).

자세한 내용은 Apple의를 참조 하세요 키-값 코딩 프로그래밍 가이드합니다.For more information, please see Apple's Key-Value Coding Programming Guide.

키 및 키 경로Keys and key paths

A 는 개체의 특정 속성을 식별 하는 문자열입니다.A Key is a string that identifies a specific property of an object. 일반적으로 키를 키-값 코딩 준수 개체에에서 접근자 메서드의 이름에 해당 합니다.Typically, a key corresponds to the name of an accessor method in a key-value coding compliant object. 키 ASCII 인코딩을 사용 해야 일반적으로 소문자로 시작 하 고 공백을 포함할 수 없습니다.Keys must use ASCII encoding, usually begin with a lowercase letter, and may not contain whitespace. 따라서 위 예제에서 지정 된 Name 의 키 값이 일 Name 의 속성을 PersonModel 클래스입니다.So given the example above, Name would be a Key Value of Name property of the PersonModel class. 노출 된 속성의 이름과 키 필요가 같을 수 있는 대부분의 경우.The Key and the name of the property that they expose don't have to be the same, however in most cases they are.

A 키 경로 점 문자열로 구분 이동할 개체 속성의 계층을 지정 하는 데 사용 되는 키입니다.A Key Path is a string of dot separated Keys used to specify a hierarchy of object properties to traverse. 받는 사람을 기준으로 시퀀스의 첫 번째 키의 속성 이며 각 후속 키 이전 속성 값을 기준으로 평가 됩니다.The property of the first key in the sequence is relative to the receiver, and each subsequent key is evaluated relative to the value of the previous property. 동일한 방식으로 개체 및 C# 클래스에서 해당 속성을 이동할 점 표기법을 사용 합니다.In the same way you use dot notation to traverse an object and its properties in a C# class.

예를 들어 확장 합니다 PersonModel 클래스 및 추가 Child 속성:For example, if you expanded the PersonModel class and added Child property:

using System;
using Foundation;

namespace MacDatabinding
{
    [Register("PersonModel")]
    public class PersonModel : NSObject
    {
        private string _name = "";
        private PersonModel _child = new PersonModel();
        
        [Export("Name")]
        public string Name {
            get { return _name; }
            set {
                WillChangeValue ("Name");
                _name = value;
                DidChangeValue ("Name");
            }
        }
        
        [Export("Child")]
        public PersonModel Child {
            get { return _child; }
            set {
                WillChangeValue ("Child");
                _child = value;
                DidChangeValue ("Child");
            }
        }
        
        public PersonModel ()
        {
        }
    }
}

자식의 이름을 키 경로 self.Child.Name 또는 간단히 Child.Name (키 값을가 사용 되는 방식을 기반 함).The Key Path to the child's name would be self.Child.Name or simply Child.Name (based on how the Key Value was being used).

키-값 코딩으로 값 가져오기Getting values using key-value coding

합니다 ValueForKey 메서드는 지정된 된 키의 값을 반환 합니다. (으로 NSString)을 기준으로 요청을 받는 KVC 클래스의 인스턴스.The ValueForKey method returns the value for the specified Key (as a NSString), relative to the instance of the KVC class receiving the request. 예를 들어 경우 Person 의 인스턴스는 PersonModel 위에 정의 된 클래스:For example, if Person is an instance of the PersonModel class defined above:

// Read value 
var name = Person.ValueForKey (new NSString("Name"));

값이 반환 된 Name 의 해당 인스턴스에 대 한 속성 PersonModel.This would return the value of the Name property for that instance of PersonModel.

키-값 코딩을 사용 하 여 값 설정Setting values using key-value coding

마찬가지로, 합니다 SetValueForKey 지정된 된 키의 값을 설정 (으로 NSString)을 기준으로 요청을 받는 KVC 클래스의 인스턴스.Similarly, the SetValueForKey set the value for the specified Key (as a NSString), relative to the instance of the KVC class receiving the request. 이번에 인스턴스를 사용 하는 PersonModel 아래와 같이 클래스:So again, using an instance of the PersonModel class, as shown below:

// Write value
Person.SetValueForKey(new NSString("Jane Doe"), new NSString("Name"));

값을 변경 합니다 Name 속성을 Jane Doe입니다.Would change the value of the Name property to Jane Doe.

관찰 값이 변경Observing value changes

키-값 관찰 (KVO)를 사용 하 관찰자 KVC 호환 클래스의 특정 키를 연결할 수 있는 하 고 해당 키에 대 한 값 (KVC 기술을 사용 하 여 또는 C# 코드에서 지정된 된 속성에 직접 액세스) 만들어질 때마다 알림을 받을 합니다.Using key-value observing (KVO), you can attach an observer to a specific Key of a KVC compliant class and be notified any time the value for that Key is modified (either using KVC techniques or directly accessing the given property in C# code). 예를 들어:For example:

// Watch for the name value changing
Person.AddObserver ("Name", NSKeyValueObservingOptions.New, (sender) => {
    // Inform caller of selection change
    Console.WriteLine("New Name: {0}", Person.Name)
});

이제 언제 든 지는 Name 의 속성을 Person 인스턴스의 PersonModel 클래스 수정 되 면 새 값에 작성 되어 콘솔.Now, any time the Name property of the Person instance of the PersonModel class is modified, the new value is written out to the console.

자세한 내용은 Apple의를 참조 하세요 키 값을 관찰 프로그래밍 가이드 소개합니다.For more information, please see Apple's Introduction to Key-Value Observing Programming Guide.

데이터 바인딩Data binding

다음 섹션에서는 데이터를 읽고 C# 코드를 사용 하 여 값을 작성 하는 대신 Xcode의 Interface Builder에서 UI 요소에 바인딩하는 키-값 코딩 및 키-값 관찰 호환 클래스를 사용 하는 방법을 알아보겠습니다.The following sections will show how you can use a key-value coding and key-value observing compliant class to bind data to UI elements in Xcode's Interface Builder, instead of reading and writing values using C# code. 이러한 방식으로 별도 사용자 데이터 모델 표시 하는 데 사용 되는 뷰에서 Xamarin.Mac 응용 프로그램 더 유연 하 고 쉽게 유지 관리할 수 있도록 합니다.In this way you separate your Data Model from the views that are used to display them, making the Xamarin.Mac application more flexible and easier to maintain. 작성 하는 코드의 양을 크게 줄일 있습니다.You also greatly decrease the amount of code that has to be written.

데이터 모델 정의Defining your data model

Xamarin.Mac 응용 프로그램 역할을 하도록 정의 된 KVC/KVO 호환 클래스 수행 해야 하기 전에 데이터를 바인딩할 Interface Builder에서 UI 요소에는 데이터 모델 바인딩에 대 한 합니다.Before you can Data Bind a UI element in Interface Builder, you must have a KVC/KVO compliant class defined in your Xamarin.Mac application to act as the Data Model for the binding. 데이터 모델의 모든 사용자 인터페이스에 표시 됩니다 하 고 응용 프로그램을 실행 하는 동안 UI에서 사용자가 데이터에 대 한 수정은 받는 데이터를 제공 합니다.The Data Model provides all of the data that will be displayed in the User Interface and receives any modifications to the data that the user makes in the UI while running the application.

예를 들어 직원의 그룹을 관리 하는 응용 프로그램을 작성 하는 경우 데이터 모델을 정의 하는 다음 클래스를 사용할 수 있습니다.For example, if you were writing an application that managed a group of employees, you could use the following class to define the Data Model:

using System;
using Foundation;
using AppKit;

namespace MacDatabinding
{
    [Register("PersonModel")]
    public class PersonModel : NSObject
    {
        #region Private Variables
        private string _name = "";
        private string _occupation = "";
        private bool _isManager = false;
        private NSMutableArray _people = new NSMutableArray();
        #endregion

        #region Computed Properties
        [Export("Name")]
        public string Name {
            get { return _name; }
            set {
                WillChangeValue ("Name");
                _name = value;
                DidChangeValue ("Name");
            }
        }

        [Export("Occupation")]
        public string Occupation {
            get { return _occupation; }
            set {
                WillChangeValue ("Occupation");
                _occupation = value;
                DidChangeValue ("Occupation");
            }
        }

        [Export("isManager")]
        public bool isManager {
            get { return _isManager; }
            set {
                WillChangeValue ("isManager");
                WillChangeValue ("Icon");
                _isManager = value;
                DidChangeValue ("isManager");
                DidChangeValue ("Icon");
            }
        }

        [Export("isEmployee")]
        public bool isEmployee {
            get { return (NumberOfEmployees == 0); }
        }

        [Export("Icon")]
        public NSImage Icon {
            get {
                if (isManager) {
                    return NSImage.ImageNamed ("group.png");
                } else {
                    return NSImage.ImageNamed ("user.png");
                }
            }
        }

        [Export("personModelArray")]
        public NSArray People {
            get { return _people; }
        }

        [Export("NumberOfEmployees")]
        public nint NumberOfEmployees {
            get { return (nint)_people.Count; }
        }
        #endregion

        #region Constructors
        public PersonModel ()
        {
        }

        public PersonModel (string name, string occupation)
        {
            // Initialize
            this.Name = name;
            this.Occupation = occupation;
        }

        public PersonModel (string name, string occupation, bool manager)
        {
            // Initialize
            this.Name = name;
            this.Occupation = occupation;
            this.isManager = manager;
        }
        #endregion

        #region Array Controller Methods
        [Export("addObject:")]
        public void AddPerson(PersonModel person) {
            WillChangeValue ("personModelArray");
            isManager = true;
            _people.Add (person);
            DidChangeValue ("personModelArray");
        }

        [Export("insertObject:inPersonModelArrayAtIndex:")]
        public void InsertPerson(PersonModel person, nint index) {
            WillChangeValue ("personModelArray");
            _people.Insert (person, index);
            DidChangeValue ("personModelArray");
        }

        [Export("removeObjectFromPersonModelArrayAtIndex:")]
        public void RemovePerson(nint index) {
            WillChangeValue ("personModelArray");
            _people.RemoveObject (index);
            DidChangeValue ("personModelArray");
        }

        [Export("setPersonModelArray:")]
        public void SetPeople(NSMutableArray array) {
            WillChangeValue ("personModelArray");
            _people = array;
            DidChangeValue ("personModelArray");
        }
        #endregion
    }
}

이 클래스의 기능 중 대부분은 검사 된 합니다 란, 키-값 코딩 위의 섹션입니다.Most of the features of this class were covered in the What is key-value coding section above. 그러나 살펴보겠습니다 몇 가지 특정 요소 및이 클래스에 대 한 데이터 모델로 작동 하도록 허용에 대 한 몇 가지 추가 배열 컨트롤러 하 고 트리 컨트롤러 (하는 데이터를 나중에 사용 바인딩할 트리 뷰개요 보기 하 고 컬렉션 뷰).However, let's look at a few specific elements and some additions that were made to allow this class to act as a Data Model for Array Controllers and Tree Controllers (which we'll be using later to Data bind Tree Views, Outline Views and Collection Views).

먼저 직원 관리자 일 수 있으므로 사용한를 NSArray (특히는 NSMutableArray 값을 수정할 수 있도록)에 연결할 관리 되는 직원 수 있도록:First, because an employee might be a manager, we've used a NSArray (specifically a NSMutableArray so the values can be modified) to allow the employees that they managed to be attached to them:

private NSMutableArray _people = new NSMutableArray();
...

[Export("personModelArray")]
public NSArray People {
    get { return _people; }
}

여기에 두 가지가 있습니다.Two things to note here:

  1. 사용 하는 NSMutableArray 표준 C# 배열 또는 컬렉션 이므로 AppKit 컨트롤에 데이터 바인딩할 요구 사항 등을 대신 테이블 뷰, 개요 보기컬렉션 .We used a NSMutableArray instead of a standard C# array or collection since this is a requirement to Data Bind to AppKit controls such as Table Views, Outline Views and Collections.
  2. 직원의 배열에 캐스팅 하 여 노출 했습니다를 NSArray 데이터에 대 한 바인딩 목적 및 변경 해당 C# 이름, 형식 People, 데이터 바인딩에서 예상 하는 하나에 personModelArray 형태로 {0} class_name} 배열(첫 번째 문자가 소문자로 변환 수행 되었음을 참고).We exposed the array of employees by casting it to a NSArray for data binding purposes and changed its C# formatted name, People, to one that data binding expects, personModelArray in the form {class_name}Array (note that the first character has been made lower case).

다음으로, 일부 특수 이름 공용 지 원하는 메서드를 추가 해야 배열 컨트롤러 하 고 트리 컨트롤러:Next, we need to add some specially name public methods to support Array Controllers and Tree Controllers:

[Export("addObject:")]
public void AddPerson(PersonModel person) {
    WillChangeValue ("personModelArray");
    isManager = true;
    _people.Add (person);
    DidChangeValue ("personModelArray");
}

[Export("insertObject:inPersonModelArrayAtIndex:")]
public void InsertPerson(PersonModel person, nint index) {
    WillChangeValue ("personModelArray");
    _people.Insert (person, index);
    DidChangeValue ("personModelArray");
}

[Export("removeObjectFromPersonModelArrayAtIndex:")]
public void RemovePerson(nint index) {
    WillChangeValue ("personModelArray");
    _people.RemoveObject (index);
    DidChangeValue ("personModelArray");
}

[Export("setPersonModelArray:")]
public void SetPeople(NSMutableArray array) {
    WillChangeValue ("personModelArray");
    _people = array;
    DidChangeValue ("personModelArray");
}

컨트롤러를 요청 하 고 표시 하는 데이터를 수정할 수 있습니다.These allow the controllers to request and modify the data that they display. 노출 된 같은 NSArray (일반적인 C# 명명 규칙에서 서로 다름)는 매우 특정 명명 규칙을 위와 있습니다.Like the exposed NSArray above, these have a very specific naming convention (that differs from the typical C# naming conventions):

  • addObject: -배열에 개체를 추가합니다.addObject: - Adds an object to the array.
  • insertObject:in{class_name}ArrayAtIndex: -여기서 {class_name} 클래스의 이름입니다.insertObject:in{class_name}ArrayAtIndex: - Where {class_name} is the name of your class. 이 메서드는 개체 배열의 지정된 된 인덱스에 삽입합니다.This method inserts an object into the array at a given index.
  • removeObjectFrom{class_name}ArrayAtIndex: -여기서 {class_name} 클래스의 이름입니다.removeObjectFrom{class_name}ArrayAtIndex: - Where {class_name} is the name of your class. 이 메서드는 지정된 된 인덱스 배열의 개체를 제거합니다.This method removes the object in the array at a given index.
  • set{class_name}Array: -여기서 {class_name} 클래스의 이름입니다.set{class_name}Array: - Where {class_name} is the name of your class. 이 메서드를 사용 하면 기존 전달 새 항목으로 교체할 수 있습니다.This method allows you to replace the existing carry with a new one.

이러한 메서드 내에서 배열에 대 한 변경 내용 래핑 했습니다 했습니다 WillChangeValueDidChangeValue KVO 규정 준수에 대 한 메시지입니다.Inside of these methods, we've wrapped changes to the array in WillChangeValue and DidChangeValue messages for KVO compliance.

이후 마지막으로 Icon 속성의 값에 의존 합니다 isManager 속성을 변경를 isManager 속성에 반영 되지 않을 수 있습니다는 Icon (KVO) 중 데이터 바인딩된 UI 요소에 대 한:Finally, since the Icon property relies on the value of the isManager property, changes to the isManager property might not be reflected in the Icon for Data Bound UI elements (during KVO):

[Export("Icon")]
public NSImage Icon {
    get {
        if (isManager) {
            return NSImage.ImageNamed ("group.png");
        } else {
            return NSImage.ImageNamed ("user.png");
        }
    }
}

문제를 해결 하려면 다음 코드를 사용 했습니다.To correct that, we use the following code:

[Export("isManager")]
public bool isManager {
    get { return _isManager; }
    set {
        WillChangeValue ("isManager");
        WillChangeValue ("Icon");
        _isManager = value;
        DidChangeValue ("isManager");
        DidChangeValue ("Icon");
    }
}

자체 키 외에도 유의 합니다 isManager 접근자를 보내고 합니다 WillChangeValueDidChangeValue 에 대 한 메시지는 Icon 도 변경 내용이 반영 하므로 키.Note that in addition to its own Key, the isManager accessor is also sending the WillChangeValue and DidChangeValue messages for the Icon Key so it will see the change as well.

사용 된 PersonModel 이 문서의 나머지 부분 전체에서 데이터 모델입니다.We'll be using the PersonModel Data Model throughout the rest of this article.

단순 데이터 바인딩Simple data binding

정의 된 데이터 모델을 사용 하 여 살펴보겠습니다 Xcode의 Interface Builder의 데이터 바인딩에 대 한 간단한 예제입니다.With our Data Model defined, let's look at a simple example of data binding in Xcode's Interface Builder. 폼 편집에 사용할 수 있는 Xamarin.Mac 응용 프로그램을 추가 해 보겠습니다에 예를 들어를 PersonModel 위에 정의 된 것입니다.For example, let's add a form to our Xamarin.Mac application that can be used to edit the PersonModel that we defined above. 몇 가지 텍스트 필드와 확인란을 표시 하 고 모델의 속성을 편집 추가할 것입니다.We'll add a few Text Fields and a Check Box to display and edit properties of our model.

먼저 새를 추가 해 보겠습니다 뷰 컨트롤러 에 우리의 Main.storyboard Interface Builder에서 파일 및 해당 클래스 이름을 SimpleViewController:First, let's add a new View Controller to our Main.storyboard file in Interface Builder and name its class SimpleViewController:

새 뷰 컨트롤러를 추가Adding a new view controller

Mac 용 Visual Studio로 돌아가서 다음으로, 편집 합니다 SimpleViewController.cs 파일 (프로젝트에 자동으로 추가 된)의 인스턴스를 노출 하 고는 PersonModel 데이터를 양식에 바인딩 드리겠습니다.Next, return to Visual Studio for Mac, edit the SimpleViewController.cs file (that was automatically added to our project) and expose an instance of the PersonModel that we will be data binding our form to. 다음 코드를 추가합니다.Add the following code:

private PersonModel _person = new PersonModel();
...

[Export("Person")]
public PersonModel Person {
    get {return _person; }
    set {
        WillChangeValue ("Person");
        _person = value;
        DidChangeValue ("Person");
    }
}

다음 뷰가 로드 되 면 만들겠습니다 인스턴스의 우리의 PersonModel 이 코드를 입력 합니다.Next when the View is loaded, let's create an instance of our PersonModel and populate it with this code:

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

    // Set a default person
    var Craig = new PersonModel ("Craig Dunn", "Documentation Manager");
    Craig.AddPerson (new PersonModel ("Amy Burns", "Technical Writer"));
    Craig.AddPerson (new PersonModel ("Joel Martinez", "Web & Infrastructure"));
    Craig.AddPerson (new PersonModel ("Kevin Mullins", "Technical Writer"));
    Craig.AddPerson (new PersonModel ("Mark McLemore", "Technical Writer"));
    Craig.AddPerson (new PersonModel ("Tom Opgenorth", "Technical Writer"));
    Person = Craig;

}

이제 이로써 폼이 해야를 두 번 클릭 합니다 Main.storyboard Interface Builder에서 편집용으로 열 파일입니다.Now we need to create our form, double-click the Main.storyboard file to open it for editing in Interface Builder. 레이아웃 폼을 다음과 같이 표시 합니다.Layout the form to look something like the following:

Xcode에서 스토리 보드를 편집Editing the storyboard in Xcode

데이터 바인딩할 폼에는 PersonModel 를 통해 노출 된 것입니다는 Person 다음을 수행 하는 키:To Data Bind the form to the PersonModel that we exposed via the Person Key, do the following:

  1. 선택 합니다 Employee Name 텍스트 필드 및 스위치를 바인딩 검사기.Select the Employee Name Text Field and switch to the Bindings Inspector.

  2. 확인 합니다 바인딩할 선택한 상자 단순 뷰 컨트롤러 드롭다운 목록에서.Check the Bind to box and select Simple View Controller from the dropdown. 그런 다음 입력 self.Person.Name 에 대 한 합니다 키 경로:Next enter self.Person.Name for the Key Path:

    키 경로 입력Entering the key path

  3. 선택 합니다 Occupation 텍스트 필드 및 확인 합니다 바인딩할 상자를 선택 간단한 뷰 컨트롤러 드롭다운 목록에서.Select the Occupation Text Field and check the Bind to box and select Simple View Controller from the dropdown. 그런 다음 입력 self.Person.Occupation 에 대 한 합니다 키 경로:Next enter self.Person.Occupation for the Key Path:

    키 경로 입력Entering the key path

  4. 선택 합니다 직원은 관리자 확인란을 확인 하 고는 바인딩할 상자를 선택 간단한 뷰 컨트롤러 드롭다운 목록에서.Select the Employee is a Manager Checkbox and check the Bind to box and select Simple View Controller from the dropdown. 그런 다음 입력 self.Person.isManager 에 대 한 합니다 키 경로:Next enter self.Person.isManager for the Key Path:

    키 경로 입력Entering the key path

  5. 선택 합니다 수의 직원 관리 텍스트 필드 및 확인 합니다 바인딩할 상자를 선택 간단한 뷰 컨트롤러 드롭다운 목록에서.Select the Number of Employees Managed Text Field and check the Bind to box and select Simple View Controller from the dropdown. 그런 다음 입력 self.Person.NumberOfEmployees 에 대 한 합니다 키 경로:Next enter self.Person.NumberOfEmployees for the Key Path:

    키 경로 입력Entering the key path

  6. 직원 관리자가 수의 직원 관리 되는 레이블 및 텍스트 필드를 숨기려면 하고자 합니다.If the employee is not a manager, we want to hide the Number of Employees Managed Label and Text Field.

  7. 선택는 수의 직원 관리 레이블을 확장를 Hidden 접혀 있는 부분을 확인 합니다 바인딩할 상자를 선택 간단한 뷰 컨트롤러 드롭다운 목록에서.Select the Number of Employees Managed Label, expand the Hidden turndown and check the Bind to box and select Simple View Controller from the dropdown. 그런 다음 입력 self.Person.isManager 에 대 한 합니다 키 경로:Next enter self.Person.isManager for the Key Path:

    키 경로 입력Entering the key path

  8. 선택 NSNegateBoolean 에서 합니다 값 변환기 드롭다운:Select NSNegateBoolean from the Value Transformer dropdown:

    NSNegateBoolean 키 변환을 선택Selecting the NSNegateBoolean key transformation

  9. 데이터 바인딩을 설정 하는 경우 레이블을 숨길 수는 그러면 값을 isManager 속성은 false합니다.This tells data binding that the label will be hidden if the value of the isManager property is false.

  10. 7 및 8 단계를 반복 합니다 수의 직원 관리 텍스트 필드입니다.Repeat steps 7 and 8 for the Number of Employees Managed Text Field.

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

응용 프로그램에서 값을 실행 하는 경우는 Person 속성 폼을 자동으로 입력 됩니다.If you run the application, the values from the Person property will automatically populate our form:

자동으로 채워진 폼을 보여 주는Showing an auto-populated form

폼의 사용자가 모든 변경 내용에 다시 기록 됩니다는 Person 뷰 컨트롤러의 속성입니다.Any changes that the users makes to the form will be written back to the Person property in the View Controller. 예를 들어, 선택 취소 직원은 관리자 업데이트를 Person 인스턴스의 우리의 PersonModel수의 직원 관리 레이블 및 텍스트 필드 (을 통해 자동으로 숨겨진 데이터 바인딩):For example, unselecting Employee is a Manager updates the Person instance of our PersonModel and the Number of Employees Managed Label and Text Field are hidden automatically (via data binding):

비 관리자에 대 한 직원 수를 숨기기Hiding the number of employees for non-managers

테이블 뷰 데이터 바인딩Table view data binding

이제 데이터를 바인딩하는 기본적인 했으므로 살펴보겠습니다 더 복잡 한 데이터 바인딩 작업을 사용 하 여는 배열 컨트롤러 및 표 보기로 데이터 바인딩.Now that we have the basics of data binding out of the way, let's look at a more complex data binding task by using an Array Controller and data binding to a Table View. 테이블 뷰를 사용 하 여 작업에 대 한 자세한 내용은 참조 하십시오 우리의 테이블 뷰 설명서.For more information on working with Table Views, please see our Table Views documentation.

먼저 새를 추가 해 보겠습니다 뷰 컨트롤러 에 우리의 Main.storyboard Interface Builder에서 파일 및 해당 클래스 이름을 TableViewController:First, let's add a new View Controller to our Main.storyboard file in Interface Builder and name its class TableViewController:

새 뷰 컨트롤러를 추가Adding a new view controller

다음으로, 편집할를 TableViewController.cs 파일 (프로젝트에 자동으로 추가 된) 및 배열 노출 (NSArray)의 PersonModel 클래스는 데이터를 양식에 바인딩 수입니다.Next, let's edit the TableViewController.cs file (that was automatically added to our project) and expose an array (NSArray) of PersonModel classes that we will be data binding our form to. 다음 코드를 추가합니다.Add the following code:

private NSMutableArray _people = new NSMutableArray();
...

[Export("personModelArray")]
public NSArray People {
    get { return _people; }
}
...

[Export("addObject:")]
public void AddPerson(PersonModel person) {
    WillChangeValue ("personModelArray");
    _people.Add (person);
    DidChangeValue ("personModelArray");
}

[Export("insertObject:inPersonModelArrayAtIndex:")]
public void InsertPerson(PersonModel person, nint index) {
    WillChangeValue ("personModelArray");
    _people.Insert (person, index);
    DidChangeValue ("personModelArray");
}

[Export("removeObjectFromPersonModelArrayAtIndex:")]
public void RemovePerson(nint index) {
    WillChangeValue ("personModelArray");
    _people.RemoveObject (index);
    DidChangeValue ("personModelArray");
}

[Export("setPersonModelArray:")]
public void SetPeople(NSMutableArray array) {
    WillChangeValue ("personModelArray");
    _people = array;
    DidChangeValue ("personModelArray");
}

수행한 것 처럼를 PersonModel 위의 클래스를 데이터 모델을 정의 섹션인 4 특별 하 게 명명 된 공용 메서드를 공개 했습니다 있도록 배열 컨트롤러 및 읽기 및 쓰기 데이터의 컬렉션에서 PersonModels.Just like we did on the PersonModel class above in the Defining your Data Model section, we've exposed four specially named public methods so that the Array Controller and read and write data from our collection of PersonModels.

그런 다음 뷰가 로드 되 면이 코드를 사용 하 여이 배열을 채우는를 해야 합니다.Next when the View is loaded, we need to populate our array with this code:

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

    // Build list of employees
    AddPerson (new PersonModel ("Craig Dunn", "Documentation Manager", true));
    AddPerson (new PersonModel ("Amy Burns", "Technical Writer"));
    AddPerson (new PersonModel ("Joel Martinez", "Web & Infrastructure"));
    AddPerson (new PersonModel ("Kevin Mullins", "Technical Writer"));
    AddPerson (new PersonModel ("Mark McLemore", "Technical Writer"));
    AddPerson (new PersonModel ("Tom Opgenorth", "Technical Writer"));
    AddPerson (new PersonModel ("Larry O'Brien", "API Documentation Manager", true));
    AddPerson (new PersonModel ("Mike Norman", "API Documenter"));

}

이제이 테이블 뷰를 작성 해야를 두 번 클릭 합니다 Main.storyboard Interface Builder에서 편집용으로 열 파일입니다.Now we need to create our Table View, double-click the Main.storyboard file to open it for editing in Interface Builder. 레이아웃은 다음과 같이 표시 합니다.Layout the table to look something like the following:

새 테이블 뷰를 레이아웃할Laying out a new table view

추가 해야는 배열 컨트롤러 테이블에 바인딩된 데이터를 제공 하려면 다음을 수행 합니다.We need to add an Array Controller to provide bound data to our table, do the following:

  1. 끌어서를 컨트롤러 배열 에서 합니다 라이브러리 검사기인터페이스 편집기:Drag an Array Controller from the Library Inspector onto the Interface Editor:

    라이브러리에서 배열 컨트롤러를 선택 하면Selecting an Array Controller from the Library

  2. 선택 배열 컨트롤러인터페이스 계층 구조 전환 하는 특성 검사기:Select Array Controller in the Interface Hierarchy and switch to the Attribute Inspector:

    특성 검사기 선택Selecting the Attributes Inspector

  3. 입력 PersonModel 에 대 한는 클래스 이름를 클릭 합니다 Plus 단추를 세 개의 키를 추가 합니다.Enter PersonModel for the Class Name, click the Plus button and add three Keys. 이름을 지정 하 여 Name하십시오 OccupationisManager:Name them Name, Occupation and isManager:

    필요한 키 경로 추가Adding the required key paths

  4. 이렇게 하면 모든 속성 배열 컨트롤러의 배열을 관리 중인 새로운 속성 (키)를 통해 노출 해야 하 고 있습니다.This tells the Array Controller what it is managing an array of, and which properties it should expose (via Keys).

  5. 으로 전환 합니다 바인딩 검사기 아래에서 콘텐츠 배열 선택 바인딩할테이블 뷰 컨트롤러합니다.Switch to the Bindings Inspector and under Content Array select Bind to and Table View Controller. 입력 한 키 경로 모델self.personModelArray:Enter a Model Key Path of self.personModelArray:

    키 경로 입력Entering a key path

  6. 이 연결의 배열에 배열 컨트롤러 PersonModels 보기 컨트롤러에 노출 하는 것입니다.This ties the Array Controller to the array of PersonModels that we exposed on our View Controller.

이제 테이블 뷰에 배열 컨트롤러에 바인딩할 해야, 다음을 수행 합니다.Now we need to bind our Table View to the Array Controller, do the following:

  1. 테이블 보기를 선택 하며 바인딩 검사기:Select the Table View and the Binding Inspector:

    바인딩 검사기 선택Selecting the Binding Inspector

  2. 아래는 목차 접혀 있는 부분을 선택 바인딩할 하 고 배열 컨트롤러합니다.Under the Table Contents turndown, select Bind to and Array Controller. 입력 arrangedObjects 에 대 한 합니다 컨트롤러 키 필드:Enter arrangedObjects for the Controller Key field:

    컨트롤러 키를 정의Defining the controller key

  3. 선택 합니다 테이블 뷰 셀 아래 합니다 직원 열입니다.Select the Table View Cell under the Employee column. 바인딩 검사기 아래에서 접혀 있는 부분을 선택 바인딩할테이블 셀 뷰합니다.In the Bindings Inspector under the Value turndown, select Bind to and Table Cell View. 입력 objectValue.Name 에 대 한 합니다 키 경로 모델:Enter objectValue.Name for the Model Key Path:

    모델 키 경로 설정Setting the model key path

  4. objectValue 현재 PersonModel 배열 컨트롤러에서 관리 되는 배열입니다.objectValue is the current PersonModel in the array being managed by the Array Controller.

  5. 선택 합니다 테이블 뷰 셀 아래 합니다 직업 열.Select the Table View Cell under the Occupation column. 바인딩 검사기 아래에서 접혀 있는 부분을 선택 바인딩할테이블 셀 뷰합니다.In the Bindings Inspector under the Value turndown, select Bind to and Table Cell View. 입력 objectValue.Occupation 에 대 한 합니다 키 경로 모델:Enter objectValue.Occupation for the Model Key Path:

    모델 키 경로 설정Setting the model key path

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

테이블 배열을 사용 하 여 채워집니다 응용 프로그램을 실행 하는 경우 PersonModels:If we run the application, the table will be populated with our array of PersonModels:

응용 프로그램을 실행Running the application

개요 뷰 데이터 바인딩Outline view data binding

한 개요 보기에 대해 데이터 바인딩을 바인딩 표 보기에 대해 매우 비슷합니다.data binding against an Outline View is very similar to binding against a Table View. 주요 차이점은 사용 하는 트리 컨트롤러 대신는 배열 컨트롤러 개요 보기에 바인딩된 데이터를 제공 합니다.The key difference is that we'll be using a Tree Controller instead of an Array Controller to provide the bound data to the Outline View. 작업 개요 보기에 대 한 자세한 내용은 참조 하십시오 우리의 개요 보기 설명서.For more information on working with Outline Views, please see our Outline Views documentation.

먼저 새를 추가 해 보겠습니다 뷰 컨트롤러 에 우리의 Main.storyboard Interface Builder에서 파일 및 해당 클래스 이름을 OutlineViewController:First, let's add a new View Controller to our Main.storyboard file in Interface Builder and name its class OutlineViewController:

새 뷰 컨트롤러를 추가Adding a new view controller

다음으로, 편집할를 OutlineViewController.cs 파일 (프로젝트에 자동으로 추가 된) 및 배열 노출 (NSArray)의 PersonModel 클래스는 데이터를 양식에 바인딩 수입니다.Next, let's edit the OutlineViewController.cs file (that was automatically added to our project) and expose an array (NSArray) of PersonModel classes that we will be data binding our form to. 다음 코드를 추가합니다.Add the following code:

private NSMutableArray _people = new NSMutableArray();
...

[Export("personModelArray")]
public NSArray People {
    get { return _people; }
}
...

[Export("addObject:")]
public void AddPerson(PersonModel person) {
    WillChangeValue ("personModelArray");
    _people.Add (person);
    DidChangeValue ("personModelArray");
}

[Export("insertObject:inPersonModelArrayAtIndex:")]
public void InsertPerson(PersonModel person, nint index) {
    WillChangeValue ("personModelArray");
    _people.Insert (person, index);
    DidChangeValue ("personModelArray");
}

[Export("removeObjectFromPersonModelArrayAtIndex:")]
public void RemovePerson(nint index) {
    WillChangeValue ("personModelArray");
    _people.RemoveObject (index);
    DidChangeValue ("personModelArray");
}

[Export("setPersonModelArray:")]
public void SetPeople(NSMutableArray array) {
    WillChangeValue ("personModelArray");
    _people = array;
    DidChangeValue ("personModelArray");
}

수행한 것 처럼를 PersonModel 위의 클래스를 데이터 모델을 정의 섹션인 4 특별 하 게 명명 된 공용 메서드를 공개 했습니다 있도록 트리 컨트롤러 및 읽기 및 쓰기 데이터의 컬렉션에서 PersonModels.Just like we did on the PersonModel class above in the Defining your Data Model section, we've exposed four specially named public methods so that the Tree Controller and read and write data from our collection of PersonModels.

그런 다음 뷰가 로드 되 면이 코드를 사용 하 여이 배열을 채우는를 해야 합니다.Next when the View is loaded, we need to populate our array with this code:

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

    // Build list of employees
    var Craig = new PersonModel ("Craig Dunn", "Documentation Manager");
    Craig.AddPerson (new PersonModel ("Amy Burns", "Technical Writer"));
    Craig.AddPerson (new PersonModel ("Joel Martinez", "Web & Infrastructure"));
    Craig.AddPerson (new PersonModel ("Kevin Mullins", "Technical Writer"));
    Craig.AddPerson (new PersonModel ("Mark McLemore", "Technical Writer"));
    Craig.AddPerson (new PersonModel ("Tom Opgenorth", "Technical Writer"));
    AddPerson (Craig);

    var Larry = new PersonModel ("Larry O'Brien", "API Documentation Manager");
    Larry.AddPerson (new PersonModel ("Mike Norman", "API Documenter"));
    AddPerson (Larry);

}

개요 보기를 만들려면 먼저 이제 두 번 클릭 합니다 Main.storyboard Interface Builder에서 편집용으로 열 파일입니다.Now we need to create our Outline View, double-click the Main.storyboard file to open it for editing in Interface Builder. 레이아웃은 다음과 같이 표시 합니다.Layout the table to look something like the following:

개요 뷰를 만드는Creating the outline view

추가 해야는 트리 컨트롤러 바인딩된 데이터는 개요를 제공 하려면 다음을 수행 합니다.We need to add an Tree Controller to provide bound data to our outline, do the following:

  1. 끌어서를 컨트롤러 트리 에서 합니다 라이브러리 검사기인터페이스 편집기:Drag an Tree Controller from the Library Inspector onto the Interface Editor:

    라이브러리에서 트리 컨트롤러를 선택할Selecting a Tree Controller from the Library

  2. 선택 트리 컨트롤러인터페이스 계층 구조 전환 하는 특성 검사기:Select Tree Controller in the Interface Hierarchy and switch to the Attribute Inspector:

    특성 검사기 선택Selecting the Attribute Inspector

  3. 입력 PersonModel 에 대 한는 클래스 이름를 클릭 합니다 Plus 단추를 세 개의 키를 추가 합니다.Enter PersonModel for the Class Name, click the Plus button and add three Keys. 이름을 지정 하 여 Name하십시오 OccupationisManager:Name them Name, Occupation and isManager:

    필요한 키 경로 추가Adding the required key paths

  4. 배열, 관리 중인 새로운 트리 컨트롤러를 이렇게 하면 속성 (키)를 통해 노출 해야 하 고 있습니다.This tells the Tree Controller what it is managing an array of, and which properties it should expose (via Keys).

  5. 아래는 트리 컨트롤러 섹션에서 입력 personModelArray 에 대 한 자식, 입력 NumberOfEmployees 아래를 개수 enter isEmployee 에서 리프:Under the Tree Controller section, enter personModelArray for Children, enter NumberOfEmployees under the Count and enter isEmployee under Leaf:

    트리 컨트롤러 키 경로 설정Setting the Tree Controller key paths

  6. 이렇게 하면 트리 컨트롤러 노드, 자식 노드 수 있습니다 및 현재 노드에 자식 노드가 있으면 모든 자식을 찾을 수 있는 위치입니다.This tells the Tree Controller where to find any child nodes, how many child nodes there are and if the current node has child nodes.

  7. 으로 전환 합니다 바인딩 검사기 아래에서 콘텐츠 배열 선택 바인딩할파일의 소유자합니다.Switch to the Bindings Inspector and under Content Array select Bind to and File's Owner. 입력 한 키 경로 모델self.personModelArray:Enter a Model Key Path of self.personModelArray:

    키 경로 편집Editing the key path

  8. 이 연결의 배열에는 트리 컨트롤러 PersonModels 보기 컨트롤러에 노출 하는 것입니다.This ties the Tree Controller to the array of PersonModels that we exposed on our View Controller.

이제 트리 컨트롤러 개요 뷰에 바인딩할 해야, 다음을 수행 합니다.Now we need to bind our Outline View to the Tree Controller, do the following:

  1. 개요 뷰에서 선택 및 합니다 바인딩 검사기 선택:Select the Outline View and in the Binding Inspector select :

    바인딩 검사기 선택Selecting the Binding Inspector

  2. 아래는 내용 보기 개요 접혀 있는 부분을 선택 바인딩할 하 고 트리 컨트롤러.Under the Outline View Contents turndown, select Bind to and Tree Controller. 입력 arrangedObjects 에 대 한 합니다 컨트롤러 키 필드:Enter arrangedObjects for the Controller Key field:

    키를 설정 하면 컨트롤러Setting the controller key

  3. 선택 합니다 테이블 뷰 셀 아래 합니다 직원 열입니다.Select the Table View Cell under the Employee column. 바인딩 검사기 아래에서 접혀 있는 부분을 선택 바인딩할테이블 셀 뷰합니다.In the Bindings Inspector under the Value turndown, select Bind to and Table Cell View. 입력 objectValue.Name 에 대 한 합니다 키 경로 모델:Enter objectValue.Name for the Model Key Path:

    모델 키 경로 입력Entering the model key path

  4. objectValue 현재 PersonModel 트리 컨트롤러에서 관리 되는 배열입니다.objectValue is the current PersonModel in the array being managed by the Tree Controller.

  5. 선택 합니다 테이블 뷰 셀 아래 합니다 직업 열.Select the Table View Cell under the Occupation column. 바인딩 검사기 아래에서 접혀 있는 부분을 선택 바인딩할테이블 셀 뷰합니다.In the Bindings Inspector under the Value turndown, select Bind to and Table Cell View. 입력 objectValue.Occupation 에 대 한 합니다 키 경로 모델:Enter objectValue.Occupation for the Model Key Path:

    모델 키 경로 입력Entering the model key path

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

윤곽선의 배열으로 채워집니다 응용 프로그램을 실행 하는 경우 PersonModels:If we run the application, the outline will be populated with our array of PersonModels:

응용 프로그램을 실행Running the application

컬렉션 뷰 데이터 바인딩Collection view data binding

컬렉션에 대 한 데이터를 제공 하는 배열 컨트롤러 사용 되는 컬렉션 뷰를 사용 하 여 데이터 바인딩은 표 보기를 사용 하 여 바인딩과 매우 유사 합니다.Data binding with a Collection View is very much like binding with a Table View, as an Array Controller is used to provide data for the collection. 컬렉션 뷰에서 미리 설정 된 표시 형식 없으므로 더 많은 작업이 필요 사용자 상호 작용 피드백을 제공 하 고 사용자가 선택한 추적 합니다.Since the collection view doesn't have a preset display format, more work is required to provide user interaction feedback and to track user selection.

중요

Xcode 7 및 macOS 10.11 (이상)는 문제로 인해 컬렉션 뷰 스토리 보드 (.storyboard) 파일 내에서 사용할 수 없는 합니다.Due to an issue in Xcode 7 and macOS 10.11 (and greater), Collection Views are unable to be used inside of a Storyboard (.storyboard) files. 결과적으로, 계속 하려면.xib 파일을 사용 하 여 Xamarin.Mac 앱에 대 한 컬렉션 보기를 정의 해야 합니다.As a result, you will need to continue to use .xib files to define your Collection Views for your Xamarin.Mac apps. 참조 하십시오 우리의 컬렉션 뷰 자세한 정보에 대 한 설명서입니다.Please see our Collection Views documentation for more information.

네이티브 크래시 디버깅Debugging native crashes

실수 데이터 바인딩에서 발생 수를 네이티브 크래시 비관리 코드와 완전히 실패 하 게 사용 하 여 Xamarin.Mac 응용 프로그램을 SIGABRT 오류:Making a mistake in your data bindings can result in a Native Crash in unmanaged code and cause your Xamarin.Mac application to fail completely with a SIGABRT error:

네이티브 크래시 대화 상자의 예Example of a native crash dialog box

데이터 바인딩 중 네 가지 주요 원인은 네이티브 크래시는 일반적으로:There are typically four major causes for native crashes during data binding:

  1. 데이터 모델에서 상속 되지 않습니다 NSObject 또는 하위 클래스 NSObject합니다.Your Data Model does not inherit from NSObject or a subclass of NSObject.
  2. Objective-c로 사용 하 여 속성을 노출 하지 않은 [Export("key-name")] 특성입니다.You did not expose your property to Objective-C using the [Export("key-name")] attribute.
  3. 접근자의 값의 변경에 배치 되지 않았습니다 WillChangeValue 하 고 DidChangeValue 메서드 호출 (으로 동일한 키를 지정 하는 Export 특성).You did not wrap changes to the accessor's value in WillChangeValue and DidChangeValue method calls (specifying the same Key as the Export attribute).
  4. 에 잘못 되었거나 잘못 입력 된 키가 있습니다 합니다 바인딩 검사기 Interface Builder에서.You have a wrong or mistyped Key in the Binding Inspector in Interface Builder.

충돌을 디코딩Decoding a crash

보겠습니다 네이티브 크래시에에서 발생할 데이터 바인딩의 있으므로 찾기 및 해결 방법에 살펴봅니다.Let's cause a native crash in our data binding so we can show how to locate and fix it. Interface Builder에서 컬렉션 보기 예제에서 첫 번째 레이블의 바인딩의 변경해 보겠습니다 NameTitle:In Interface Builder, let's change our binding of first Label in the Collection View example from Name to Title:

바인딩 키를 편집Editing the binding key

변경 내용을 저장 하겠습니다 Xcode와 동기화 하 여 응용 프로그램을 실행 하는 Mac 용 Visual Studio로 다시 전환 합니다.Let's save the change, switch back to Visual Studio for Mac to sync with Xcode and run our application. 컬렉션 뷰에서 표시 되 면 응용 프로그램 사용 하 여 일시적으로 중단 됩니다는 SIGABRT 오류 (에 표시 된 대로 합니다 응용 프로그램 출력 Mac 용 Visual Studio에서) 하므로 PersonModel 키를 사용 하 여 속성을 노출 하지 않습니다 Title:When the Collection View is displayed, the application will momentarily crash with a SIGABRT error (as shown in the Application Output in Visual Studio for Mac) since the PersonModel does not expose a property with the Key Title:

바인딩 오류 예가Example of a binding error

맨 위의에서 오류의으로 스크롤하면 합니다 응용 프로그램 출력 문제를 해결 하기 위한 키를 볼 수 있습니다.If we scroll to the very top of the error in the Application Output we can see the key to solving the issue:

오류 로그에서 문제를 찾는Finding the issue in the error log

이 줄은 표시 되는데 키 Title 에 바인딩하므로 개체에 존재 하지 않습니다.This line is telling us that the key Title doesn't exist on the object that we are binding to. 바인딩을 다시 변경 하면 Name Interface Builder를 저장, 동기화, 다시 작성 및 실행, 응용 프로그램이 예상 대로 실행 됩니다 문제 없이 합니다.If we change the binding back to Name in Interface Builder, save, sync, rebuild and run, the application will run as expected without issue.

요약Summary

이 문서에서는 자세히 살펴보고 데이터 바인딩 및 Xamarin.Mac 응용 프로그램에서 키-값 코딩 작업을 수행 했습니다.This article has taken a detailed look at working with data binding and key-value coding in a Xamarin.Mac application. 첫째,이 키-값 관찰 (KVO) 및 키-값 코딩 (KVC)를 사용 하 여 Objective-c를 C# 클래스를 노출 살펴보았습니다.First, it looked at exposing a C# class to Objective-C by using key-value coding (KVC) and key-value observing (KVO). 다음으로 KVO 호환 클래스를 사용 하는 방법에 알아보았습니다 하 고 데이터 Xcode의 Interface Builder에서 UI 요소에 바인딩합니다.Next, it showed how to use a KVO compliant class and Data Bind it to UI elements in Xcode's Interface Builder. 마지막으로 설명 했습니다 복잡 한 데이터 바인딩을 사용 하 여 배열 컨트롤러 하 고 트리 컨트롤러합니다.Finally, it showed complex data binding using Array Controllers and Tree Controllers.