チュートリアル: iOS Objective-C ライブラリのバインド

重要

現在、Xamarin プラットフォームでのカスタム バインディングの使用を調査しています。 今後の開発作業の発展のために、このアンケートにご回答ください。

この記事では、既存 Objective-C のライブラリ InfColorPicker の Xamarin.iOS バインドを作成する実践的なチュートリアルを提供します。 静的 Objective-C ライブラリのコンパイル、バインド、Xamarin.iOS アプリケーションでのバインドの使用などのトピックについて説明します。

iOS で作業しているときに、サード パーティ Objective-C 製ライブラリを使用する場合が発生する可能性があります。 このような状況では、Xamarin.iOS バインド Projectを使用して、Xamarin.iOS アプリケーションでライブラリを使用できるようにする C# バインディングを作成できます。

一般に、iOS エコシステムでは、次の 3 種類のライブラリを見つけることができます。

  • ヘッダー (.h ファイル) と共に拡張子を持 .a つプリコンパイル済み静的ライブラリ ファイルとして。 たとえば、 Google の Analytics ライブラリ
  • プリコンパイル済みフレームワークとして。 これは、静的ライブラリ、ヘッダー、および拡張機能を含 .framework む追加のリソースを含むフォルダーにすぎません。 たとえば、 Google の AdMob ライブラリなどです
  • 単なるソース コード ファイルとして。 たとえば、Just .m ファイルと .h Objective C ファイルを含むライブラリです。

1 番目と 2 番目のシナリオでは、プリコンパイル済みの CocoaTouch 静的ライブラリが既に存在するため、この記事では 3 番目のシナリオに焦点を当てます。 バインドの作成を開始する前に、ライブラリに用意されているライセンスを常に確認して、バインドを自由に行えるかどうかを確認してください。

この記事では、例として オープンソース InfColorPickerObjective-C プロジェクトを使用してバインド プロジェクトを作成する手順について説明しますが、このガイドのすべての情報は、任意のサード パーティObjective-C製ライブラリで使用できるように調整できます。 InfColorPicker ライブラリは、ユーザーが HSB 表現に基づいて色を選択できるようにする再利用可能なビュー コントローラーを提供し、色の選択をより使いやすくします。

Example of the InfColorPicker library running on iOS

Xamarin.iOS でこの特定 Objective-C の API を使用するために必要なすべての手順について説明します。

  • まず、Xcode を使用して静的ライブラリを Objective-C 作成します。
  • 次に、この静的ライブラリを Xamarin.iOS とバインドします。
  • 次に、Objective Sharpie が Xamarin.iOS バインドで必要な API 定義の一部 (ただし、すべてではない) を自動的に生成することで、ワークロードを削減する方法を示します。
  • 最後に、バインディングを使用する Xamarin.iOS アプリケーションを作成します。

サンプル アプリケーションでは、InfColorPicker API と C# コードの間の通信に強力なデリゲートを使用する方法を示します。 強力なデリゲートを使用する方法を確認したら、弱いデリゲートを使用して同じタスクを実行する方法について説明します。

要件

この記事では、Xcode と Objective-C 言語に関する知識があり、 Binding Objective-C のドキュメントを参照していることを前提としています。 さらに、表示される手順を完了するには、次のものが必要です。

  • Xcode と iOS SDK - Apple の Xcode と最新の iOS API を開発者のコンピューターにインストールして構成する必要があります。
  • Xcode コマンド ライン ツール - Xcode の現在インストールされているバージョンの Xcode コマンド ライン ツールをインストールする必要があります (インストールの詳細については、以下を参照してください)。
  • Visual Studio for MacまたはVisual Studio - 最新バージョンのVisual Studio for MacまたはVisual Studioを開発用コンピューターにインストールして構成する必要があります。 Xamarin.iOS アプリケーションを開発するには Apple Mac が必要です。Visual Studioを使用する場合は、Xamarin.iOS ビルド ホストに接続する必要があります
  • Objective Sharpie の最新バージョン - ここからダウンロードした Objective Sharpie ツールの現在のコピー です。 Objective Sharpie が既にインストールされている場合は、 sharpie update

Xcode コマンド ライン ツールのインストール

前述のように、このチュートリアルでは Xcode コマンド ライン ツール (具体的にはmakelipo) を使用します。 この make コマンドは、プログラムのビルド方法を指定する メイクファイル を使用して実行可能プログラムとライブラリのコンパイルを自動化する、非常に一般的な Unix ユーティリティです。 この lipo コマンドは、マルチアーキテクチャ ファイルを作成するための OS X コマンド ライン ユーティリティです。複数の .a ファイルを 1 つのファイルにまとめ、すべてのハードウェア アーキテクチャで使用できます。

Apple の Xcode FAQ ドキュメントを使用したコマンド ラインからのビルドに関するドキュメントによると、OS X 10.9 以降では、Xcode Preferences ダイアログの [ダウンロード] ウィンドウでは、コマンドライン ツールのダウンロードがサポートされなくなりました。

ツールをインストールするには、次のいずれかの方法を使用する必要があります。

  • Xcode のインストール - Xcode をインストールすると、すべてのコマンド ライン ツールにバンドルされます。 OS X 10.9 shims (インストールされている) では、Xcode 内の /usr/bin対応するツールに含まれる任意の /usr/bin ツールをマップできます。 たとえば、 xcrun コマンドを使用すると、コマンド ラインから Xcode 内の任意のツールを検索または実行できます。

  • ターミナル アプリケーション - ターミナル アプリケーションから、コマンド を実行してコマンド ライン ツールを xcode-select --install インストールできます。

    • ターミナル アプリケーションを起動します。
    • Enter キーを押します。次のように入力xcode-select --installします。
    Europa:~ kmullins$ xcode-select --install
    
    • コマンド ライン ツールをインストールするように求められます。[ インストール ] ボタンをクリックします。 Installing the command line tools

    • ツールは、Apple のサーバーからダウンロードしてインストールされます。 Downloading the tools

  • Apple 開発者向けのダウンロード - コマンド ライン ツール パッケージは 、Apple Developers のダウンロード Web ページで入手できます。 Apple ID でログインし、コマンド ライン ツールを検索してダウンロードします。 Finding the Command Line Tools

コマンド ライン ツールがインストールされたので、チュートリアルを続行する準備ができました。

チュートリアル

このチュートリアルでは、次の手順について説明します。

  • 静的ライブラリを作成する - この手順では、 InfColorPickerObjective-C コードの静的ライブラリを作成します。 静的ライブラリにはファイル拡張子が .a 付き、ライブラリ プロジェクトの .NET アセンブリに埋め込まれます。
  • Xamarin.iOS バインド Projectを作成する - 静的ライブラリを作成したら、それを使用して Xamarin.iOS バインド プロジェクトを作成します。 バインド プロジェクトは、先ほど作成した静的ライブラリと、API の使用方法を説明する C# コードの形式の Objective-C メタデータで構成されます。 このメタデータは、一般に API 定義と呼ばれます。 Objective Sharpie を使用して、API 定義の作成を支援します。
  • API 定義を正規化する - Objective Sharpie は、私たちを支援する素晴らしい仕事をしますが、すべてを行うことはできません。 API 定義を使用する前に行う必要があるいくつかの変更について説明します。
  • バインド ライブラリを使用する - 最後に、Xamarin.iOS アプリケーションを作成して、新しく作成したバインド プロジェクトの使用方法を示します。

どのような手順が関係するかを理解したので、チュートリアルの残りの部分に進みましょう。

静的ライブラリの作成

Github で InfColorPicker のコードを検査する場合:

Inspect the code for InfColorPicker in Github

プロジェクトには、次の 3 つのディレクトリが表示されます。

  • InfColorPicker - このディレクトリには、プロジェクトの Objective-C コードが含まれています。
  • PickerSamplePad - このディレクトリには、プロジェクトiPadサンプルが含まれています。
  • PickerSamplePhone - このディレクトリには、プロジェクトiPhoneサンプルが含まれています。

GitHubから InfColorPicker プロジェクトをダウンロードし、選択したディレクトリに解凍してみましょう。 プロジェクトの Xcode ターゲット PickerSamplePhone を開くと、Xcode ナビゲーターに次のプロジェクト構造が表示されます。

The project structure in the Xcode Navigator

このプロジェクトでは、InfColorPicker ソース コード (赤いボックス内) を各サンプル プロジェクトに直接追加することで、コードの再利用を実現します。 サンプル プロジェクトのコードは、青いボックス内にあります。 この特定のプロジェクトでは静的ライブラリが提供されないため、静的ライブラリをコンパイルする Xcode プロジェクトを作成する必要があります。

最初の手順では、InfoColorPicker ソース コードを静的ライブラリに追加します。 これを実現するには、次の操作を行います。

  1. Xcode を起動します。

  2. [ファイル] メニューの [新規>Project...

    Screenshot shows Project selected from the New menu of the File menu.

  3. [フレームワーク & ライブラリ] の [Cocoa Touch Static Library] テンプレートを選択し、[次へ] ボタンをクリックします。

    Select the Cocoa Touch Static Library template

  4. Project名を入力InfColorPickerし、[次へ] ボタンをクリックします。

    Enter InfColorPicker for the Project Name

  5. プロジェクトを保存する場所を選択し、[ OK] ボタンをクリックします。

  6. 次に、InfColorPicker プロジェクトのソースを静的ライブラリ プロジェクトに追加する必要があります。 InfColorPicker.h ファイルは静的ライブラリ (既定) に既に存在するため、Xcode では上書きできません。 Finder から、GitHubから解凍した元のプロジェクトの InfColorPicker ソース コードに移動し、すべての InfColorPicker ファイルをコピーして、新しい静的ライブラリ プロジェクトに貼り付けます。

    Copy all of the InfColorPicker files

  7. Xcode に戻り、 InfColorPicker フォルダーを右クリックし、[ファイルの追加] を [InfColorPicker...] に選択します。

    Adding files

  8. [ファイルの追加] ダイアログ ボックスで、先ほどコピーした InfColorPicker ソース コード ファイルに移動し、すべて選択して [ 追加 ] ボタンをクリックします。

    Select all and click the Add button

  9. ソース コードがプロジェクトにコピーされます。

    The source code will be copied into the project

  10. Xcode Project ナビゲーターから InfColorPicker.m ファイルを選択し、最後の 2 行をコメントアウトします (このライブラリの書き込み方法のため、このファイルは使用されません)。

    Editing the InfColorPicker.m file

  11. ライブラリに必要なフレームワークがあるかどうかを確認する必要があります。 この情報は、README で、または提供されているサンプル プロジェクトのいずれかを開いて見つけることができます。 この例では 、をUIKit.framework使用Foundation.frameworkするため、CoreGraphics.framework追加します。

  12. InfColorPicker ターゲット>のビルド フェーズを選択し、[ライブラリを含むバイナリのリンク] セクションを展開します。

    Expand the Link Binary With Libraries section

  13. このボタンを + 使用してダイアログを開き、上記の必要なフレーム フレームワークを追加できます。

    Add the required frames frameworks listed above

  14. [ Link Binary With Libraries]\(ライブラリを使用してバイナリをリンク \) セクションは、次の図のようになります。

    The Link Binary With Libraries section

この時点では近いですが、まだ完了していません。 静的ライブラリは作成されましたが、iOS デバイスと iOS シミュレーターの両方に必要なすべてのアーキテクチャを含む Fat バイナリを作成するためにビルドする必要があります。

Fat Binary の作成

すべての iOS デバイスには、時間の経過と同時に開発された ARM アーキテクチャを搭載したプロセッサがあります。 各新しいアーキテクチャでは、下位互換性を維持しながら、新しい命令やその他の機能強化が追加されました。 iOS デバイスには armv6、armv7、armv7s、arm64 命令セットがありますが、 armv6 はそれ以上使用されません。 iOS シミュレーターは ARM を使用せず、代わりに x86 および x86_64 電源シミュレーターです。 つまり、各命令セットにライブラリを用意する必要があります。

Fat ライブラリは、 .a サポートされているすべてのアーキテクチャを含むファイルです。

脂肪バイナリの作成は、次の 3 つの手順で行います。

  • ARM 7 & ARM64 バージョンの静的ライブラリをコンパイルします。
  • x86 および x84_64 バージョンの静的ライブラリをコンパイルします。
  • コマンド ライン ツールを lipo 使用して、2 つの静的ライブラリを 1 つに結合します。

これら 3 つの手順は簡単ですが、ライブラリが更新プログラムを受け取ったとき Objective-C 、またはバグ修正が必要な場合は、今後それらを繰り返す必要がある場合があります。 これらの手順を自動化する場合は、今後の iOS バインド プロジェクトのメンテナンスとサポートが簡略化されます。

このようなタスクを自動化するために使用できるツールは、シェル スクリプト、 レークxbuild、make など、多数あります。 Xcode コマンド ライン ツールがインストールされると、 make このチュートリアルで使用されるビルド システムもインストールされます。 iOS デバイスと任意のライブラリのシミュレーターで動作するマルチアーキテクチャ共有ライブラリを作成するために使用できる Makefile を次に示します。

XBUILD=/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild
PROJECT_ROOT=./YOUR-PROJECT-NAME
PROJECT=$(PROJECT_ROOT)/YOUR-PROJECT-NAME.xcodeproj
TARGET=YOUR-PROJECT-NAME

all: lib$(TARGET).a

lib$(TARGET)-i386.a:
	$(XBUILD) -project $(PROJECT) -target $(TARGET) -sdk iphonesimulator -configuration Release clean build
	-mv $(PROJECT_ROOT)/build/Release-iphonesimulator/lib$(TARGET).a $@

lib$(TARGET)-armv7.a:
	$(XBUILD) -project $(PROJECT) -target $(TARGET) -sdk iphoneos -arch armv7 -configuration Release clean build
	-mv $(PROJECT_ROOT)/build/Release-iphoneos/lib$(TARGET).a $@

lib$(TARGET)-arm64.a:
	$(XBUILD) -project $(PROJECT) -target $(TARGET) -sdk iphoneos -arch arm64 -configuration Release clean build
	-mv $(PROJECT_ROOT)/build/Release-iphoneos/lib$(TARGET).a $@

lib$(TARGET).a: lib$(TARGET)-i386.a lib$(TARGET)-armv7.a lib$(TARGET)-arm64.a
	xcrun -sdk iphoneos lipo -create -output $@ $^

clean:
	-rm -f *.a *.dll

選択したプレーン テキスト エディターで Makefile コマンドを入力し、セクションを YOUR-PROJECT-NAME でプロジェクトの名前で更新します。 また、上記の手順を正確に貼り付け、指示内のタブを保持しておくことも重要です。

Makefile という名前のファイルを、上で作成した InfColorPicker Xcode 静的ライブラリと同じ場所に保存します。

Save the file with the name Makefile

Mac でターミナル アプリケーションを開き、Makefile の場所に移動します。 ターミナルに入力 make して Enter キーを 押すと、 Makefile が実行されます。

Sample makefile output

make を実行すると、多くのテキストがスクロールして表示されます。 すべてが正常に動作した場合は、BUILD SUCCEEDED という単語が表示されlibInfColorPicker-armv7.alibInfColorPicker-i386.aファイルは MakefilelibInfColorPickerSDK.a同じ場所にコピーされます。

The libInfColorPicker-armv7.a, libInfColorPicker-i386.a and libInfColorPickerSDK.a files generated by the Makefile

次のコマンドを使用して、Fat バイナリ内のアーキテクチャを確認できます。

xcrun -sdk iphoneos lipo -info libInfColorPicker.a

これにより、次の情報が表示されます。

Architectures in the fat file: libInfColorPicker.a are: i386 armv7 x86_64 arm64

この時点で、Xcode と Xcode コマンド ライン ツールmakelipoを使用して静的ライブラリを作成し、iOS バインディングの最初の手順を完了しました。 次の手順に進み、 Objective-Sharpie を使用して、API バインディングの作成を自動化しましょう。

Xamarin.iOS バインド Projectを作成する

Objective-Sharpie を使用してバインド プロセスを自動化するには、(Objective-Sharpie を使用してビルドを支援する) API 定義を格納する Xamarin.iOS バインディング Projectを作成し、C# バインディングを作成する必要があります。

次の操作を行います。

  1. Visual Studio for Mac を起動します。

  2. [ファイル] メニューの [NewSolution>...] を選択します。

    Starting a new solution

  3. [新しいソリューション] ダイアログ ボックスで、[LibraryiOS>バインド Project] を選択します。

    Select iOS Binding Project

  4. [次へ] をクリックします。

  5. Project名として「InfColorPickerBinding」と入力し、[作成] ボタンをクリックしてソリューションを作成します。

    Enter InfColorPickerBinding as the Project Name

ソリューションが作成され、2 つの既定のファイルが含まれます。

The solution structure in the Solution Explorer

  • ApiDefinition.cs - このファイルには、API の C# でのラップ方法 Objective-C を定義するコントラクトが含まれます。
  • Structs.cs - このファイルには、インターフェイスとデリゲートに必要なすべての構造体または列挙値が保持されます。

このチュートリアルの後半で、これら 2 つのファイルを操作します。 まず、InfColorPicker ライブラリをバインド プロジェクトに追加する必要があります。

バインド Projectに静的ライブラリを含めます

これで基本バインド Projectの準備ができました。InfColorPicker ライブラリ用に上記で作成した Fat Binary ライブラリを追加する必要があります。

ライブラリを追加するには、次の手順に従います。

  1. Solution Pad の [ネイティブ参照 ] フォルダーを右クリックし、[ ネイティブ参照の追加] を選択します。

    Add Native References

  2. 前に作成した Fat Binary (libInfColorPickerSDK.a) に移動し、[ 開く ] ボタンを押します。

    Select the libInfColorPickerSDK.a file

  3. ファイルはプロジェクトに含まれます。

    Including a file

.a ファイルがプロジェクトに追加されると、Xamarin.iOS によって自動的にファイルのビルド アクションObjcBindingNativeLibrary に設定され、という特殊libInfColorPickerSDK.linkwith.csなファイルが作成されます。

このファイルには、先ほど追加した LinkWith 静的ライブラリの処理方法を Xamarin.iOS に指示する属性が含まれています。 このファイルの内容は、次のコード スニペットに示されています。

using ObjCRuntime;

[assembly: LinkWith ("libInfColorPickerSDK.a", SmartLink = true, ForceLoad = true)]

この属性は LinkWith 、プロジェクトの静的ライブラリといくつかの重要なリンカー フラグを識別します。

次に、InfColorPicker プロジェクトの API 定義を作成する必要があります。 このチュートリアルでは、Objective Sharpie を使用して ApiDefinition.cs ファイルを生成します。

Objective Sharpie の使用

Objective Sharpie は、サード パーティ Objective-C 製ライブラリを C# にバインドするために必要な定義の作成に役立つコマンド ライン ツール (Xamarin によって提供されます) です。 このセクションでは、Objective Sharpie を使用して、InfColorPicker プロジェクトの初期 ApiDefinition.cs を作成します。

まず、この ガイドで詳しく説明されているように Objective Sharpie インストーラー ファイルをダウンロードしてみましょう。 インストーラーを実行し、インストール ウィザードから画面上のすべてのプロンプトに従って、開発用コンピューターに Objective Sharpie をインストールします。

Objective Sharpie が正常にインストールされたら、ターミナル アプリを起動し、次のコマンドを入力して、バインドに役立つすべてのツールに関するヘルプを取得しましょう。

sharpie -help

上記のコマンドを実行すると、次の出力が生成されます。

Europa:Resources kmullins$ sharpie -help
usage: sharpie [OPTIONS] TOOL [TOOL_OPTIONS]

Options:
  -h, --helpShow detailed help
  -v, --versionShow version information

Available Tools:
  xcode              Get information about Xcode installations and available SDKs.
  pod                Create a Xamarin C# binding to Objective-C CocoaPods
  bind               Create a Xamarin C# binding to Objective-C APIs
  update             Update to the latest release of Objective Sharpie
  verify-docs        Show cross reference documentation for [Verify] attributes
  docs               Open the Objective Sharpie online documentation

このチュートリアルでは、次の Objective Sharpie ツールを使用します。

  • xcode - このツールは、現在の Xcode のインストールと、インストールした iOS および Mac API のバージョンに関する情報を提供します。 この情報は、後でバインディングを生成するときに使用します。
  • bind - このツールを使用して、InfColorPicker プロジェクトの .h ファイルを初期 ApiDefinition.cs ファイルと StructsAndEnums.cs ファイルに解析します。

特定の Objective Sharpie ツールに関するヘルプを表示するには、ツールの名前とオプションを -help 入力します。 たとえば、 sharpie xcode -help 次の出力を返します。

Europa:Resources kmullins$ sharpie xcode -help
usage: sharpie xcode [OPTIONS]+

Options:
  -h, -help           Show detailed help
  -v, -verbose        Be verbose with output

Xcode Options:
  -sdks               List all available Xcode SDKs. Pass -verbose for more
                        details.
  -sdkpath SDK        Output the path of the SDK
  -frameworks SDK     List all available framework directories in a given SDK.

バインド プロセスを開始する前に、ターミナル sharpie xcode -sdksに次のコマンドを入力して、現在インストールされている SDK に関する情報を取得する必要があります。

amyb:Desktop amyb$ sharpie xcode -sdks
sdk: appletvos9.2    arch: arm64
sdk: iphoneos9.3     arch: arm64   armv7
sdk: macosx10.11     arch: x86_64  i386
sdk: watchos2.2      arch: armv7

上記から、マシンに SDK が iphoneos9.3 インストールされていることがわかります。 この情報を設定すると、InfColorPicker プロジェクト .h ファイルを最初の ApiDefinition.cs および StructsAndEnums.cs InfColorPicker プロジェクトに解析する準備が整いました。

ターミナル アプリで次のコマンドを入力します。

sharpie bind --output=InfColorPicker --namespace=InfColorPicker --sdk=[iphone-os] -scope [full-path-to-project]/InfColorPicker/InfColorPicker [full-path-to-project]/InfColorPicker/InfColorPicker/*.h

[full-path-to-project]InfColorPicker Xcode プロジェクト ファイルがコンピューター上に配置されているディレクトリへの完全なパスを指定します。[iphone-os] は、コマンドでsharpie xcode -sdks説明したように、インストールした iOS SDK です。 この例では、このディレクトリ内のすべてのヘッダー ファイルを含む *.h をパラメーターとして渡しました。通常は、これを行うのではなく、ヘッダー ファイルを慎重に読み取って、他のすべての関連ファイルを参照する最上位の .h ファイルを見つけ、それを Objective Sharpie に渡すだけです。

ヒント

引数の -scope 場合は、バインドするヘッダーがあるフォルダーを渡します。 -scope引数を指定しないと、Objective Sharpie はインポートされたすべての iOS SDK ヘッダーのバインドを生成しようとします。その結果#import <UIKit.h>、バインド プロジェクトのコンパイル時にエラーが発生する可能性が高い巨大な定義ファイルが生成されます。 引数が -scope 設定されている場合、Objective Sharpie はスコープ付きフォルダーの外部にあるヘッダーのバインドを生成しません。

ターミナルで次の 出力 が生成されます。

Europa:Resources kmullins$ sharpie bind -output InfColorPicker -namespace InfColorPicker -sdk iphoneos8.1 /Users/kmullins/Projects/InfColorPicker/InfColorPicker/InfColorPicker.h -unified
Compiler configuration:
    -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk -miphoneos-version-min=8.1 -resource-dir /Library/Frameworks/ObjectiveSharpie.framework/Versions/1.1.1/clang-resources -arch armv7 -ObjC

[  0%] parsing /Users/kmullins/Projects/InfColorPicker/InfColorPicker/InfColorPicker.h
In file included from /Users/kmullins/Projects/InfColorPicker/InfColorPicker/InfColorPicker.h:60:
/Users/kmullins/Projects/InfColorPicker/InfColorPicker/InfColorPickerController.h:28:1: warning: no 'assign',
      'retain', or 'copy' attribute is specified - 'assign' is assumed [-Wobjc-property-no-attribute]
@property (nonatomic) UIColor* sourceColor;
^
/Users/kmullins/Projects/InfColorPicker/InfColorPicker/InfColorPickerController.h:28:1: warning: default property
      attribute 'assign' not appropriate for non-GC object [-Wobjc-property-no-attribute]
/Users/kmullins/Projects/InfColorPicker/InfColorPicker/InfColorPickerController.h:29:1: warning: no 'assign',
      'retain', or 'copy' attribute is specified - 'assign' is assumed [-Wobjc-property-no-attribute]
@property (nonatomic) UIColor* resultColor;
^
/Users/kmullins/Projects/InfColorPicker/InfColorPicker/InfColorPickerController.h:29:1: warning: default property
      attribute 'assign' not appropriate for non-GC object [-Wobjc-property-no-attribute]
4 warnings generated.
[100%] parsing complete
[bind] InfColorPicker.cs
Europa:Resources kmullins$

また、 InfColorPicker.enums.cs ファイルと InfColorPicker.cs ファイルがディレクトリに作成されます。

The InfColorPicker.enums.cs and InfColorPicker.cs files

上記で作成した Binding プロジェクトで、これらのファイルの両方を開きます。 InfColorPicker.cs ファイルの内容をコピーし、ApiDefinition.cs ファイルに貼り付けます。既存namespace ...のコード ブロックを InfColorPicker.cs ファイルの内容に置き換えます (usingステートメントはそのまま残します)。

The InfColorPickerControllerDelegate file

API 定義を正規化する

Objective Sharpie では翻訳 Delegates中に問題が発生する場合があるため、インターフェイスの InfColorPickerControllerDelegate 定義を変更し、行を [Protocol, Model] 次のように置き換える必要があります。

[BaseType(typeof(NSObject))]
[Model]

定義は次のようになります。

The definition

次に、ファイルのInfColorPicker.enums.cs内容と同じことを行い、ステートメントをそのまま残usingしてファイルにStructsAndEnums.csコピーして貼り付けます。

The contents the StructsAndEnums.cs file

また、Objective Sharpie がバインディングに属性の注釈を付 [Verify] けている場合もあります。 これらの属性は、バインディングを元の C/Objective-C 宣言と比較して、Objective Sharpie が正しいことを確認する必要があることを示します (バインドされた宣言の上のコメントで提供されます)。 バインドを確認したら、verify 属性を削除する必要があります。 詳細については、 検証 ガイドを参照してください。

この時点で、バインド プロジェクトが完了し、ビルドする準備が整う必要があります。 バインド プロジェクトをビルドし、エラーが発生していないことを確認します。

バインド プロジェクトをビルドし、エラーがないことを確認する

バインドの使用

上記で作成した iOS バインド ライブラリを使用するサンプル iPhone アプリケーションを作成するには、次の手順に従います。

  1. Xamarin.iOS Projectの作成 - 次のスクリーンショットに示すように、InfColorPickerSample という新しい Xamarin.iOS プロジェクトをソリューションに追加します。

    Adding a Single View App

    Setting the Identifier

  2. バインド Projectへの参照の追加 - InfColorPickerSample プロジェクトを更新して、InfColorPickerBinding プロジェクトへの参照を取得します。

    Adding Reference to the Binding Project

  3. iPhoneユーザー インターフェイスを作成する - InfColorPickerSample プロジェクトの MainStoryboard.storyboard ファイルをダブルクリックして、iOS デザイナーで編集します。 次に示すように、 ボタン をビューに追加して ChangeColorButton呼び出します。

    Adding a Button to the view

  4. InfColorPickerView.xib を追加 する - InfColorPicker Objective-C ライブラリには .xib ファイルが含まれています。 Xamarin.iOS はバインド プロジェクトにこの .xib を含めず、サンプル アプリケーションで実行時エラーが発生します。 この回避策は、 .xib ファイルを Xamarin.iOS プロジェクトに追加することです。 Xamarin.iOS プロジェクトを選択し、右クリックして [Add Files]\(ファイルの追加>\) を選択し、次のスクリーンショットに示すように .xib ファイルを追加します。

    Add the InfColorPickerView.xib

  5. 質問されたら、 .xib ファイルをプロジェクトにコピーします。

次に、プロトコル Objective-C の概要と、バインドと C# コードでのプロトコルの処理方法を見てみましょう。

プロトコルと Xamarin.iOS

で Objective-C、プロトコルは、特定の状況で使用できるメソッド (またはメッセージ) を定義します。 概念的には、C# のインターフェイスと非常によく似ています。 プロトコルと C# インターフェイスの主な Objective-C 違いの 1 つは、プロトコルに省略可能なメソッド (クラスが実装する必要がないメソッド) を持つことです。 Objective-C は、 @optional 省略可能なメソッドを示すためにキーワードを使用します。 プロトコルの詳細については、「 イベント、プロトコル、デリゲート」を参照してください。

InfColorPickerController には、次のコード スニペットに示すように、このようなプロトコルが 1 つ用意されています。

@protocol InfColorPickerControllerDelegate

@optional

- (void) colorPickerControllerDidFinish: (InfColorPickerController*) controller;
// This is only called when the color picker is presented modally.

- (void) colorPickerControllerDidChangeColor: (InfColorPickerController*) controller;

@end

このプロトコルは、ユーザーが新しい色を選択し、 InfColorPickerController が完了したことをクライアントに通知するために 、InfColorPickerController によって使用されます。 Objective Sharpie は、次のコード スニペットに示すように、このプロトコルをマップしました。

[BaseType(typeof(NSObject))]
[Model]
public partial interface InfColorPickerControllerDelegate {

    [Export ("colorPickerControllerDidFinish:")]
    void ColorPickerControllerDidFinish (InfColorPickerController controller);

    [Export ("colorPickerControllerDidChangeColor:")]
    void ColorPickerControllerDidChangeColor (InfColorPickerController controller);
}

バインド ライブラリがコンパイルされると、Xamarin.iOS によって、仮想メソッドを使用してこのインターフェイスを実装する、という InfColorPickerControllerDelegate抽象基本クラスが作成されます。

Xamarin.iOS アプリケーションでこのインターフェイスを実装する方法は 2 つあります。

  • 厳密なデリゲート - 強力なデリゲートを使用するには、適切なメソッドをサブクラス化 InfColorPickerControllerDelegate してオーバーライドする C# クラスを作成する必要があります。 InfColorPickerController は、このクラスのインスタンスを使用してクライアントと通信します。
  • 弱いデリゲート - 弱いデリゲートは、一部のクラスでパブリック メソッドを作成し (など InfColorPickerSampleViewController)、そのメソッドを属性を介してプロトコルに公開するという InfColorPickerDelegate 、少し異なる手法です Export

強力なデリゲートは、Intellisense、型の安全性、およびより優れたカプセル化を提供します。 これらの理由から、弱いデリゲートではなく、可能な場所で強力なデリゲートを使用する必要があります。

このチュートリアルでは、最初に強力なデリゲートを実装してから、弱いデリゲートを実装する方法の両方の方法について説明します。

強力なデリゲートの実装

強力なデリゲートを使用してメッセージに応答することで、Xamarin.iOS アプリケーションを colorPickerControllerDidFinish: 終了します。

サブクラス InfColorPickerControllerDelegate - という名前 ColorSelectedDelegateのプロジェクトに新しいクラスを追加します。 次のコードが含まれるように、クラスを編集します。

using InfColorPickerBinding;
using UIKit;

namespace InfColorPickerSample
{
  public class ColorSelectedDelegate:InfColorPickerControllerDelegate
  {
    readonly UIViewController parent;

    public ColorSelectedDelegate (UIViewController parent)
    {
      this.parent = parent;
    }

    public override void ColorPickerControllerDidFinish (InfColorPickerController controller)
    {
      parent.View.BackgroundColor = controller.ResultColor;
      parent.DismissViewController (false, null);
    }
  }
}

Xamarin.iOS は、というInfColorPickerControllerDelegate抽象基本クラスを作成してデリゲートをバインドObjective-Cします。 この型をサブクラス化し、メソッドを ColorPickerControllerDidFinish オーバーライドして、 ResultColorInfColorPickerController.

ColorSelectedDelegate のインスタンスを作成する - イベント ハンドラーには、前の手順で作成した ColorSelectedDelegate 型のインスタンスが必要です。 クラス InfColorPickerSampleViewController を編集し、次のインスタンス変数をクラスに追加します。

ColorSelectedDelegate selector;

ColorSelectedDelegate 変数を初期化する - 有効なインスタンスであることをselector確認するには、次のViewControllerスニペットに一致するようにメソッドViewDidLoadを更新します。

public override void ViewDidLoad ()
{
  base.ViewDidLoad ();
  ChangeColorButton.TouchUpInside += HandleTouchUpInsideWithStrongDelegate;
  selector = new ColorSelectedDelegate (this);
}

メソッド HandleTouchUpInsideWithStrongDelegate を実装する - 次に、ユーザーが ColorChangeButton に触れたときのイベント ハンドラーを実装します。 次のメソッドを編集 ViewControllerして追加します。

using InfColorPicker;
...

private void HandleTouchUpInsideWithStrongDelegate (object sender, EventArgs e)
{
    InfColorPickerController picker = InfColorPickerController.ColorPickerViewController();
    picker.Delegate = selector;
    picker.PresentModallyOverViewController (this);
}

最初に静的メソッドを使用してインスタンス InfColorPickerController を取得し、そのインスタンスにプロパティ InfColorPickerController.Delegateを使用して強力なデリゲートを認識させる。 このプロパティは、Objective Sharpie によって自動的に生成されました。 最後に、ユーザーが色を選択できるように、ビューInfColorPickerSampleViewController.xibの表示を呼び出PresentModallyOverViewControllerします。

アプリケーションを実行する - この時点で、すべてのコードが完了しました。 アプリケーションを実行すると、次の InfColorColorPickerSampleView スクリーンショットに示すように、背景色を変更できます。

Running the Application

おめでとうございます。 この時点で、Xamarin.iOS アプリケーションで使用するライブラリが正常に作成され、バインドされました Objective-C 。 次に、弱いデリゲートの使用について説明します。

弱いデリゲートの実装

Xamarin.iOS では、特定のデリゲートのプロトコルに Objective-C バインドされたクラスをサブクラス化する代わりに、派生 NSObjectする任意のクラスにプロトコル メソッドを実装し、メソッド ExportAttributeを修飾し、適切なセレクターを指定することもできます。 この方法を使用する場合は、プロパティではなく、クラスのインスタンスを WeakDelegate プロパティに Delegate 割り当てます。 弱いデリゲートを使用すると、デリゲート クラスを別の継承階層に柔軟に配置できます。 Xamarin.iOS アプリケーションで弱いデリゲートを実装して使用する方法を見てみましょう。

TouchUpInside のイベント ハンドラーを作成 する - [背景色の変更] ボタンのイベントの新しいイベント ハンドラー TouchUpInside を作成してみましょう。 このハンドラーは、前のセクションで作成した HandleTouchUpInsideWithStrongDelegate ハンドラーと同じロールを満たしますが、強力なデリゲートの代わりに弱いデリゲートを使用します。 クラス ViewControllerを編集し、次のメソッドを追加します。

private void HandleTouchUpInsideWithWeakDelegate (object sender, EventArgs e)
{
    InfColorPickerController picker = InfColorPickerController.ColorPickerViewController();
    picker.WeakDelegate = this;
    picker.SourceColor = this.View.BackgroundColor;
    picker.PresentModallyOverViewController (this);
}

ViewDidLoad の更新 - 先ほど作成したイベント ハンドラーを使用するように変更 ViewDidLoad する必要があります。 次のコード スニペットに似た編集 ViewController と変更 ViewDidLoad を行います。

public override void ViewDidLoad ()
{
    base.ViewDidLoad ();
    ChangeColorButton.TouchUpInside += HandleTouchUpInsideWithWeakDelegate;
}

colorPickerControllerDidFinish: Message - 完了するとViewController、iOS によってメッセージcolorPickerControllerDidFinish:WeakDelegateが送信されます。 このメッセージを処理できる C# メソッドを作成する必要があります。 これを行うには、C# メソッドを作成し、それを ExportAttribute. 次のメソッドを編集 ViewControllerし、クラスに追加します。

[Export("colorPickerControllerDidFinish:")]
public void ColorPickerControllerDidFinish (InfColorPickerController controller)
{
    View.BackgroundColor = controller.ResultColor;
    DismissViewController (false, null);
}

アプリケーションを実行します。 以前とまったく同じように動作するはずですが、強力なデリゲートの代わりに弱いデリゲートを使用しています。 この時点で、このチュートリアルは正常に完了しました。 Xamarin.iOS バインド プロジェクトを作成して使用する方法について理解を得る必要があります。

まとめ

この記事では、Xamarin.iOS バインド プロジェクトを作成して使用するプロセスについて説明しました。 まず、既存 Objective-C のライブラリを静的ライブラリにコンパイルする方法について説明しました。 次に、Xamarin.iOS バインド プロジェクトを作成する方法と、Objective Sharpie を使用してライブラリの API 定義を生成する方法について説明しました Objective-C 。 生成された API 定義を更新して調整し、パブリック消費に適した API 定義にする方法について説明しました。 Xamarin.iOS バインド プロジェクトが完了したら、強力なデリゲートと弱いデリゲートの使用に重点を置いて、Xamarin.iOS アプリケーションでそのバインドを使用することに進みます。