Sie haben viele Optionen, je nachdem, wie Ihre "baseView" -Klasse verwendet und in Ihre Anwendung integriert werden soll. Es ist nicht klar, wie Sie diese Klasse verwenden möchten - als Ansicht in einer UIViewController-Unterklasse oder als wiederverwendbare modulare Komponente, die in Ihrer gesamten Anwendung mehrfach instanziiert werden soll, um in vielen verschiedenen Ansichtscontrollern verwendet zu werden.
Wenn Ihre Ansicht die einzige Ansicht in einer UIViewController-Unterklasse sein soll, ist Phonitive korrekt. Bündeln Sie sie zusammen mit der .xib-Datei der UIViewController-Unterklasse und verwenden Sie die viewDidLoad des UIViewController, um die endgültige Initialisierung durchzuführen.
Wenn Sie jedoch möchten, dass Ihre View-Klasse eine Unterkomponente ist, die mehrfach in verschiedenen View-Controllern wiederverwendet wird und entweder über Code oder durch Aufnahme in eine .xib-Datei für einen anderen Controller integriert wird, müssen Sie sowohl die initWithFrame: init-Methode als auch awakeFromNib implementieren. beide Fälle zu behandeln. Wenn Ihre interne Initialisierung immer einige Objekte aus .xib enthält, müssen Sie Ihre .xib in Ihrem initWithFrame manuell laden, um "Kunden" -Klassen zu unterstützen, die Ihr Widget über Code erstellen möchten. Wenn eine .xib-Datei Ihr Objekt enthält, müssen Sie sicherstellen, dass Sie alle für den Code erforderlichen Finalisierungen von awakeFromNib aus aufrufen.
Hier ist ein Beispiel für das Erstellen einer UIView-Unterklassenkomponente mit dem UI-Design in einer Schreibfeder.
MyView.h:
@interface MyView : UIView
{
UIView *view;
UILabel *l;
}
@property (nonatomic, retain) IBOutlet UIView *view;
@property (nonatomic, retain) IBOutlet UILabel *l;
MyView.m:
#import "MyView.h"
@implementation MyView
@synthesize l, view;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil];
[self addSubview:self.view];
}
return self;
}
- (void) awakeFromNib
{
[super awakeFromNib];
[self addSubview:self.view];
}
- (void) dealloc
{
[l release];
[view release];
[super dealloc];
}
So sieht die NIB-Datei aus (außer dass der Eigentümer dieser Datei in die MyView-Klasse geändert werden muss).
Stellen Sie sicher, dass sowohl die Ansichts- als auch die Beschriftungsausgänge mit dem Eigentümer der Datei verbunden sind. Das ist es! Eine Vorlage zum Erstellen wiederverwendbarer UIView-Widgets.
Das wirklich Schöne an dieser Struktur ist, dass Sie Instanzen Ihres MyView-Objekts in anderen NIB-Dateien platzieren können, einfach eine UIView an der gewünschten Position / Größe platzieren und dann die Klasse im Identitätsinspektor (CMD-4) in MyView ändern können. und boom, du hast eine Instanz deines Widgets in jeder gewünschten Ansicht! Genau wie bei UIKit-Objekten können Sie Delegierungsprotokolle implementieren, damit Objekte, die Ihr Widget verwenden, über interessante Ereignisse informiert werden und Daten bereitstellen können, die im Widget angezeigt werden, um es anzupassen.
Ich habe diesen Beitrag gefunden, nachdem ich in meiner App ein Problem damit hatte. Ich habe versucht, die Ansicht von einer NIB in der ViewDidLoad-Methode zu instanziieren, aber die Steuerelemente haben sich so verhalten, als wären sie deaktiviert. Ich hatte Probleme damit, die userInteractionEnabled-Eigenschaft direkt festzulegen und den Touch-Ereignis-Selektor für eine Schaltfläche in dieser Ansicht programmgesteuert festzulegen. Nichts hat geklappt. Ich bin auf einen anderen Beitrag gestoßen und habe festgestellt, dass viewDidLoad wahrscheinlich zu früh war, um diese NIB zu laden. Ich habe die Last auf die ViewWillAppear-Methode verschoben und alles hat funktioniert. Hoffe, das hilft jemand anderem, der damit zu kämpfen hat. Die Hauptantwort war großartig und funktioniert jetzt gut für mich, da ich sie vom richtigen Ort aus anrufen lasse.
quelle
Wenn Sie eine NIB verwenden möchten, ist es besser, wenn Ihr UIView mit einem UIViewController verknüpft ist. In diesem Fall können Sie es verwenden
UIViewController *vc=[[UIViewController alloc] initWithNibName:@"YourNIBWihtOUTEXTENSION" bundle:nil] [self.view addSubView:vc.view ];
Aufgrund von Speicherlecks müssen Sie vc freigeben
quelle
Wenn Sie eine benutzerdefinierte UIView mit einer xib-Datei haben.
- (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; id mainView; if (self) { NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"HomeAllAdsView" owner:self options:nil]; mainView = [subviewArray objectAtIndex:0]; } return mainView; } - (void) awakeFromNib { [super awakeFromNib]; }
quelle
Dieser Beitrag hat mir geholfen, wiederverwendbare Ansichten mit Interface Builder und Auto Layout zu erstellen . Der Trick bestand darin, die IBOutlets auf FileOwner zu setzen und die Inhaltsansicht nach dem Laden der Schreibfeder selbst hinzuzufügen
quelle