2012-06-25 19 views
6

Mit MonoTouch versuche ich eine benutzerdefinierte Ansicht zu erstellen, damit ich diese Ansicht mehrmals auf einem Bildschirm wiederverwenden kann. (Es ist eine Reihe von Etiketten und Schaltflächen) Nach dem Lesen der Antwort auf diesen Beitrag: How to add a custom view to a XIB file defined view in monotouch Ich muss nah sein, aber das scheint nur mir zu erlauben, eine benutzerdefinierte Ansicht, in myCustomView.CS definiert, aber was ich Ich suche nach einer Möglichkeit, eine eigene .XIB zu verwenden, um meine benutzerdefinierte Ansicht im Interface Builder zu entwerfen und nur die entsprechende CS-Datei zum Hinzufügen von Logik zu verwenden. Wenn ich versuche, ein XIB mit demselben Namen zu erstellen, wird der Inhalt nicht sichtbar.Erstellen einer benutzerdefinierten Ansicht mit einer xib

Gefolgt Schritte:

  • In MyCustomView.CS ich [Register("MyCustomView")] gesetzt worden.

  • implementiert ich den Konstruktor public MyView(IntPtr handle) : base(handle) {}

  • öffnen ViewController.XIB im Interface Builder, eine UIView hinzufügen und es ist Klasse MyCustomView.

Wenn ich diesen Code ausführen, sehe ich die neu hinzugefügte UIView, aber nicht die Elemente innerhalb der Ansicht, dh der Inhalt von MyCustomView.XIB

Wenn ich etwas, um den Code von MyCustomView hinzuzufügen. CS, wie this.Backgroundcolor = UIColor.Blue; Dies wird angezeigt, aber alle Elemente, die zu der .XIB hinzugefügt werden, sind nicht. Wie kann ich Monotouch mitteilen, alle in MyCustomView.XIB definierten Objekte anzuzeigen? In Objective-C Beispielen sehe ich Sachen wie "initWithNib" Leider ist die "LoadNib" Sektion nicht in der Monotouch api dokumentiert, aber das klingt nach etwas was ich tun sollte, aber wie und wo?

+0

Können Sie den Code zur Verfügung stellen Sie die xib Ansicht hinzufügen verwenden? Vielen Dank. –

Antwort

4

Eine sehr sehr schöne Frage, aber es geht mehr darum, wie XIBs funktionieren und was wir dagegen tun können.

Wenn Sie einem XIB ein Objekt hinzufügen und es als benutzerdefinierte Klasse festlegen, weisen Sie das UIKit nur an, eine Instanz dieses Objekts zu erstellen. Die Tatsache, die Sie in IB als eine Ansicht, eine Schaltfläche oder eine Kontrolle sehen, ist, wie IB es für Sie zeichnet. Auf diese Weise liegt die Verantwortung für die Erstellung der Prognose vollständig in Ihrer Klasse.

In Objective-C können wir einen netten Trick machen, um XIBs mit benutzerdefinierten Ansichten zu haben und sie trotzdem zu IB hinzuzufügen, indem wir den Klassennamen der hinzugefügten Ansicht setzen. Dies ist möglich, weil Sie eine beliebige Instanz von der Methode -init Ihrer Klasse in Objective-C zurückgeben können, was mit C# nicht möglich ist.

Sie können jedoch nach wie vor Ihr Leben erleichtern, indem Sie folgendermaßen vorgehen:

  1. wir definieren XIB eine XIB sein, die Ihren Inhalt benutzerdefinierte Ansicht enthält; Platzieren Sie als XIB, dem Sie eine benutzerdefinierte Ansicht hinzufügen möchten.
  2. Erstellen Sie benutzerdefinierte Klasse anzeigen und eine XIB die Interna es
  3. Griff AwakeFromNib Methode legen Ihre XIB
  4. Nachdem geladen Ihre XIB fügen Sie einfach die Interna es zu Ihrer Instanz als Subviews tatsächlich zu laden.
  5. Setzen Sie eine reguläre Ansicht und stellen Sie sie auf Ihre eigene Klasse ein Platzierung
  6. Genießen Sie!

Sie haben jedoch akzeptieren, dass Ihr XIB eine Stammansicht oder etwas enthalten würde, die als Subview auf die Instanz der Klasse setzen in Placement hinzugefügt werden würde.

Auf diese Weise sollten Sie so etwas wie haben:

XIB mit Ihrem kundenspezifischen Sichten des Inhalts:

XIB with your custom view contents

Placement, wo Sie Ihre XIB hinzufügen:

Placement where you add your XIB

Wie Die zu Ihrem Placement hinzugefügte Anzeigeinstanz ist dieselbe Als Dateieigner in Ihrem XIB können Sie Steckdosen und Aktionen in sowohl XIB und Placement setzen. Vergessen Sie nicht, dass die root-Ansicht in Ihrer XIB nicht die Instanz ist, die UIKit zum Platzieren erstellt.

Zur besseren Vergleichbarkeit, bitte meinen Code, unterhalb der Basisklasse finden die Schaffung eines solchen Ansichten zu erleichtern:

using System; 

using MonoTouch.ObjCRuntime; 
using MonoTouch.Foundation; 
using MonoTouch.UIKit; 

namespace Member.iOS.Base.Views { 

    /// <summary> 
    /// XibView is a Xib-backed UIView subclass which enables easy customization and custom 
    /// behavior addition. 
    /// </summary> 
    public class XibView : UIView { 

     /// <summary> 
     /// Exception thrown when a loaded XIB doesn't contain any views inside it. 
     /// </summary> 
     class EmptyXibException : Exception { 
     } 

     /// <summary> 
     /// Initializes a new instance of the <see cref="Member.iOS.Base.Views.XibView"/> class. 
     /// </summary> 
     /// <param name='handle'> 
     /// Handle. 
     /// </param> 
     public XibView(IntPtr handle) : base(handle) { 
     } 

     /// <summary> 
     /// Upon loading from a containing XIB, takes care of replacing the current instance (which acts as a stab) with 
     /// a real view loaded from its XIB. 
     /// </summary> 
     public override void AwakeFromNib() { 
      base.AwakeFromNib(); 

      NSArray views = NSBundle.MainBundle.LoadNib(GetType().Name, this, new NSDictionary()); 

      if (views.Count == 0) { 
       throw new EmptyXibException(); 
      } 

      UIView rootView = Runtime.GetNSObject(views.ValueAt(0)) as UIView; 
      rootView.Frame = new System.Drawing.RectangleF(0, 0, Frame.Width, Frame.Height); 
      AddSubview(rootView); 
     } 

    } 
} 
6

Aufgrund meiner Erfahrung in Code obj-c, werde ich den folgenden Code versuchen:

var views = NSBundle.MainBundle.LoadNib(nibName, this, null); // (1) 
MyCustomView myView = Runtime.GetNSObject(views.ValueAt(0)) as MyCustomView; // (2) 

(1) Hier können Sie die xib-Datei laden

(2) ermöglicht es Ihnen, zu konvertieren Konvertieren eines IntPtr in einen entsprechend typisierten NSObject (Sub-) Typ.

Sobald Sie myView haben, können Sie es als traditionelle Ansicht hinzufügen. Überprüfen Sie, ob Sie das Outtel für Ihre Ansicht korrekt eingerichtet haben.

P.S. Wenn Sie einige andere Details angeben, können wir Ihnen helfen. Überprüfen Sie außerdem den Code, weil ich von Hand geschrieben habe.

Verwandte Themen