2012-06-13 13 views
10

Normalerweise erstellen ich meine benutzerdefinierten Ansichten programmatisch und lassen sie auch mit benutzerdefinierten Init-Methoden (z. B. initWithFrame: SomeParam: OtherParam) programmgesteuert initialisiert werden. Ist es möglich, solche benutzerdefinierten Ansichten in Kombination mit einer XIB-Datei zu verwenden? Das heißt, eine übergeordnete xib-Datei zu haben, die verschiedene dieser benutzerdefinierten Ansichten als Teilansichten hat, in denen diese Teilansichten möglicherweise eine andere init-Methode verwenden müssen?Benutzerdefinierte iOS-Ansichten in xib-Dateien

Antwort

10

entfernen möchten Wenn Sie benutzerdefinierte Ansichten in eine xib Datei hinzufügen, können Sie keine benutzerdefinierte initializer verwenden. Sie werden alle mit initialisiert.

In der Regel werden Sie in einer allgemeinen Methode eingerichtet, die von dort oder in awakeFromNib aufgerufen wird.

Wenn Sie benutzerdefinierte Eigenschaften für Ihre Ansicht festlegen müssen, die von außerhalb stammen, tun Sie dies in viewDidLoad Ihres View-Controllers.

+0

Wenn ich tun müssen, bevor ViewDidLoad meines View-Controllers, wie zu tun es? So Beispiel ... Meine Ansicht wird verwendet, um eine Seite eines Buches anzuzeigen.Ohne benutzerdefinierte Init-Methode wie initWithPage: page verwende ich gleichzeitig auch das Storyboard. – Carina

+1

Vor viewDidLoad ist Ihre Ansicht nicht vorhanden. Verschieben Sie einfach das Setup, das Sie in initWith ... ausführen, in eine andere Methode und nehmen Sie die gewünschten Änderungen vor, nachdem Sie die Eigenschaft festgelegt haben. – jrturton

3

natürlich ist es möglich. Ziehen Sie eine uiview in die Xib, nicht in die Standardansicht. dann machen Sie eine IBOutlet UIView *myCustomView; und verbinden Sie es dann mit der anderen Ansicht. wenn u diese Ansicht anzeigen möchten fügen Sie diese als [self.view addSubview:myCustomView]; wenn es

[myCustomView removeFromSuperView];

enter image description here

+0

Also ... wie wäre es mit InitWithSomeValue: Wert Funktion? – Carina

+0

Dies funktioniert nicht, wenn Sie eine benutzerdefinierte Header-Ansicht über mehrere XIB-Dateien teilen möchten ... Sie müssten es genau in jedem XIB neu definieren – LightningStryk

6

Holen Sie die Xib der Ansicht initialisiert den normalen Weg und mit der Referenz tun die benutzerdefinierten Einstellungen. Dieser Teil kann in der init-Methode wie this-

 -(void)initfunction{ 
     UIView *containerView = [[[NSBundle mainBundle] loadNibNamed:@"myView" owner:self options:nil] lastObject]; 
     containerView.property1 = xyz;//Customization 
     containerView.property2= abc;//Customization 
     containerView.frame = CGRectMake(x,y,z,p);//Customization 
     [rootView addSubview:containerView]; 


    } 

gesetzt wird der Punkt ist, wenn wir eine xib verwenden wir initialisieren nicht explizit, die xib Utility-Funktionen ein initialisierten Objekt zurück (von UIView), nachdem man das bekommt UIView Objekt kann er/sie das initialisierte Objekt als nur ein reguläres Objekt verwenden, um weitere benutzerdefinierte Änderungen vorzunehmen.

0

Die Klassen UINib (iOS) und NSNib (OS X) bieten eine bessere Leistung in Situationen, in denen Sie mehrere Kopien des Inhalts einer NIB-Datei erstellen möchten. Der normale Nib-Ladevorgang beinhaltet das Lesen der NIB-Datei von der Platte und das anschließende Instanziieren der darin enthaltenen Objekte. Mit den Klassen UINib und NSNib wird die NIB-Datei jedoch einmal von der Festplatte gelesen und der Inhalt wird im Speicher gespeichert. Da sie sich im Speicher befinden, dauert das Erstellen aufeinanderfolgender Objektgruppen weniger Zeit, da kein Zugriff auf die Festplatte erforderlich ist.

  1. Erstellen einer Sicht xib Datei: Rechtsklick auf das Projekt -> Neue Datei -> Benutzeroberfläche -> Ansicht (zB werden Sie „MyView.xib“ haben)
  2. Füllen Sie die Ansicht mit Interface Builder
  3. next-Methode Sie übergeordnete Komponente

    static UINib *nib = nil; 
    
    - (UIView*)createNewViewFromNib: (NSString *)nibFileName 
    { 
        if(nib == nil) { 
         nib = [UINib nibWithNibName:nibFileName bundle:nil ]; 
        } 
    
        // Unarchiving objects from the nib. You can do it multiple times to create a number of objects from same nib. 
        NSArray* topLevelObjs = [nib instantiateWithOwner:self options:nil]; 
    
        if (topLevelObjs == nil) 
        { 
         NSLog(@"Warning! Could not load nib file.\n"); 
         return nil; 
        } 
        // We have only one view in the nib. 
        return [topLevelObjs objectAtIndex:0]; 
    } 
    
  4. Verwendung von Code nächste Zeile, die Sie mit wieder verwendbaren nib Objekt ansehen zu instanziiert:

    UIView *item = [self createNewViewFromNib:@"MyView"]; 
    // [self.view addSubview:item];