アプリケーション全体で使用するための非標準のトップナビゲーションバーを作成しようとしています。これを達成するために、私はサブクラス化UINavigationController
を試みてきましたUINavigationBar
カスタムNavigationController
クラスがあります
partial class ZooNavigationController : UINavigationController
{
public ZooNavigationController (IntPtr handle) : base (typeof(TopNavBar), null)
{
this.Handle = handle;
}
}
これは基本コンストラクターを指します
public UINavigationController (Type navigationBarType, Type toolbarType);
私のカスタムUINavigationBar
クラスの場合TopNavBar
は...
public class TopNavBar : UINavigationBar
{
public TopNavBar ()
{
InitCustom ();
}
public void InitCustom(){
this.BackgroundColor = UIColor.Red;
// a bunch more custom stuff
}
}
問題は、これを実行したときにTopNavBarが呼び出されないことです。コンストラクターを次のように調整しようとすると、次のようになります。
public ZooNavigationController (IntPtr handle) : base (typeof(TopNavBar), null)
{
this.Handle = handle;
TopNavBar test = (TopNavBar)this.NavigationBar;
}
タイプをキャストできないというランタイム例外が発生したため、タイプを指定する呼び出しを無視しているようUINavigationBar
です。
誰かが私がここで欠けているものを手伝ってくれる?
結局、編集すると、ストーリーボード内にカスタムUINavigationBarを設定できるという事実が欠けていたことがわかりました。それをミゲルの答えと組み合わせると、私はクラスに行き着きました
partial class TopNavBar : UINavigationBar
{
public TopNavBar(IntPtr test) : base(test) {
}
[Export ("initWithCoder:")]
public TopNavBar (NSCoder coder) : base (coder) {
InitCustom ();
}
}
IntPtrコンストラクターは、Objective-Cによって作成され、C#に表示されるオブジェクトに応答して呼び出されます。これは一般に、これらのクラスがインスタンス化される方法ではありません。
あなたが自分自身に尋ねなければならない最初の質問は、あなたのクラスのインスタンスを誰が作成しているのかということです。
上記の例では、間違いがあります。IntPtrコンストラクターをオーバーライドしています。これは、基本クラスのIntPtrコンストラクターのみを呼び出す必要があります(「Objective-cに実オブジェクトへのポインターがあるため、次のラッパーを作成する」という意味です。それ")。
私の推測では、C#を使用していると思います。その場合、必要なのは、引数をとらない新しいコンストラクターを提供することです。
public ZooNavigationController () : base (typeof (YourNavigation), typeof(YourBar)) {
// Your own initialization goes here
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加