Xamarin.iOSのiOSデザイナーでカスタムコントロールを使用する
2015年10月8日 (木) 05:56時点における153.220.4.222 (トーク)による版
Xamarin.iOSに搭載されるiOSデザイナーでは、標準コンポーネント(コントロール)に加え、自作のコンポーネントやXamarin Component Storeは販売配布されているコンポーネントを使用できるようだ。 [1]
目次
要件
カスタムコンポーネントをデザイン領域上で扱えるようにするには以下の条件を満たす必要がある。
- MonoTouch.UIKit.UIViewまたはMonoTouch.UIKit.UIViewControllerを直接または間接的に継承していること。
- Objective-Cにクラス登録するためMonoTouch.Foundation.RegisterAttributeを持つこと。
- デフォルトコンストラクタ(引数のないコンストラクタ)と、引数にIntPtrを持つコンストラクタを持つこと。
こんな感じか。
using System;
using System.Drawing;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
[Register("MBButtonEx")]
public class MBButtonEx : UIButton
{
public MBButtonEx() {}
public MBButtonEx(IntPtr handle)
: base(handle) {}
public MBButtonEx(RectangleF frame)
: base(frame)
{
InitUI();
}
public override void AwakeFromNib()
{
base.AwakeFromNib();
InitUI();
}
void InitUI()
{
this.TitleLabel.Text = "押せ!";
}
}
ライブラリ化
カスタムコントロールを別プロジェクトとしてライブラリ化すると実行時にエラーログが表示され正常に動かない。
- 「Unknown class MyClass in Interface Builder file.」
これはxibファイル(storyboardファイル)がロードされたタイミングで外部アセンブリがロードされていないないため発生しているようだ。 外部アセンブリはそこに含まれるクラスやメソッドなどの何かしらを最初に使ったタイミングでロードされるようだ。
そこでライブラリプロジェクトに以下のような静的ダミーメソッド・ダミークラスを追加しておき、Xamarin.iOSプロジェクトのMainメソッドから真っ先に呼び出してやることで解決する。もっとまともな解決策があるのかもしれないが知らん。
ライブラリプロジェクト側
namespace MonoBook.iOS
{
public static class Loader
{
public static bool Link() => true;
}
}
Xamarin.iOSプロジェクト側
namespace IOSApp01
{
public class Application
{
// This is the main entry point of the application.
static void Main(string[] args)
{
// ダミーメソッドを呼び出す
MonoBook.iOS.Loader.Link();
// if you want to use a different Application Delegate class from "AppDelegate"
// you can specify it here.
UIApplication.Main(args, null, "AppDelegate");
}
}
}
デバッグ
カスタムツールボックスアイテム
カスタムプロパティ
注意事項
関連項目
類似項目
- MonoMac/Interface Builderでカスタムコントロールを使用する
- MonoMacでNIBやXIBを使いデザインする場合は若干手順が異なる。