「Xamarin.iOSのiOSデザイナーでカスタムコントロールを使用する」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
1行目: 1行目:
Xamarin.iOSに搭載されるiOSデザイナーでは、標準コンポーネント(コントロール)に加え、自作のコンポーネントやXamarin Component Storeは販売配布されているコンポーネントを使用できるようだ。
+
[[Xamarin.iOS]]に搭載されるiOSデザイナーでは、標準コンポーネント(コントロール)に加え、自作のコンポーネントやXamarin Component Storeは販売配布されているコンポーネントを使用できるようだ。
 
<ref>http://developer.xamarin.com/guides/ios/user_interface/designer/custom_components/</ref>
 
<ref>http://developer.xamarin.com/guides/ios/user_interface/designer/custom_components/</ref>
  
41行目: 41行目:
 
         }
 
         }
 
     }
 
     }
 +
</source>
 +
 +
==ライブラリ化==
 +
カスタムコントロールを別プロジェクトとしてライブラリ化すると実行時にエラーログが表示され正常に動かない。
 +
*「Unknown class MyClass in Interface Builder file.」
 +
これはxibファイル(storyboardファイル)がロードされたタイミングで外部アセンブリがロードされていないないため発生しているようだ。
 +
外部アセンブリはそこに含まれるクラスやメソッドなどの何かしらを最初に使ったタイミングでロードされるようだ。
 +
 +
そこでライブラリプロジェクトに以下のような静的ダミーメソッド・ダミークラスを追加しておき、Xamarin.iOSプロジェクトのMainメソッドから真っ先に呼び出してやることで解決する。もっとまともな解決策があるのかもしれないが知らん。
 +
 +
ライブラリプロジェクト側
 +
<source lang="csharp">
 +
namespace MonoBook.iOS
 +
{
 +
    public static class Loader
 +
    {
 +
        public static bool Link() => true;
 +
    }
 +
}
 +
</source>
 +
 +
Xamarin.iOSプロジェクト側
 +
<source lang="csharp">
 +
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");
 +
        }
 +
    }
 +
}
 
</source>
 
</source>
  

2015年10月8日 (木) 05:56時点における版

Xamarin.iOSに搭載されるiOSデザイナーでは、標準コンポーネント(コントロール)に加え、自作のコンポーネントやXamarin Component Storeは販売配布されているコンポーネントを使用できるようだ。 [1]

要件

カスタムコンポーネントをデザイン領域上で扱えるようにするには以下の条件を満たす必要がある。

  1. MonoTouch.UIKit.UIViewまたはMonoTouch.UIKit.UIViewControllerを直接または間接的に継承していること。
  2. Objective-Cにクラス登録するためMonoTouch.Foundation.RegisterAttributeを持つこと。
  3. デフォルトコンストラクタ引数のないコンストラクタ)と、引数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");
        }
    }
}

デバッグ

カスタムツールボックスアイテム

カスタムプロパティ

注意事項

関連項目

類似項目

参考文献