6 Stimmen

Ein nib-Datei innerhalb eines UIViewControllers laden

Ich experimentiere damit, wie man Nib-Dateien zu einem UIViewController lädt.

Ich habe eine separate Nib-Datei namens Email erstellt. Zuerst habe ich festgestellt, dass die Methode initWithNibName nicht aufgerufen wird, wenn der View-Controller geladen wird. Also habe ich sie manuell aus der Methode viewDidLoad aufgerufen, wie folgt:

[self initWithNibName:@"Email" bundle:[NSBundle mainBundle]];

Es hat nicht funktioniert. Außerdem habe ich eine Warnung erhalten, die besagt Ausdrucksergebnis nicht verwendet.

Ich habe im Internet recherchiert und bin auf diesen Artikel gestoßen und habe die Methode loadView wie beschrieben implementiert:

- (void)loadView
{
    [super loadView];

    UINib *nib = [UINib nibWithNibName:@"Email" bundle:nil];
    [nib instantiateWithOwner:self options:nil];
}

Die Methode wird aufgerufen, aber der View-Controller ist immer noch leer!

Kann mir jemand sagen, was ich hier übersehe und wie das gemacht werden kann?

Danke.

UPDATE:

Zunächst einmal vielen Dank für alle Antworten. Allerdings legen die Antworten von voromax und svena nahe, dass ich Segues entfernen und Nibs automatisch laden sollte, was ich nicht sehr mögen. Anils Antwort funktioniert und jetzt muss ich noch eine letzte Hürde überwinden.

Ich habe mehrere Nib-Dateien. Abhängig von der Auswahl des Benutzers sollte eine bestimmte Nib geladen werden. Also habe ich alle Nib-Dateien in das Array wie folgt platziert:

- (void)loadView
{
    [super loadView];

    NSArray *nibs = [[NSArray alloc] initWithObjects:
                     [[NSBundle mainBundle] loadNibNamed:@"Facsimile" owner:self options:nil],
                     [[NSBundle mainBundle] loadNibNamed:@"Email" owner:self options:nil],
                     [[NSBundle mainBundle] loadNibNamed:@"Memorandum" owner:self options:nil],
                     [[NSBundle mainBundle] loadNibNamed:@"ProjectMemo" owner:self options:nil], nil];

    self.view = [nibs objectAtIndex:0];
}

und darauf zugreifen, indem man den Index verwendet, wie self.view = [nibs objectAtIndex(1)];. Aber es wirft einen Fehler *Beendigung der App aufgrund einer unbehandelten Ausnahme 'NSInvalidArgumentException', Grund: '-[__NSArrayM _setViewDelegate:]: nicht erkannter Selektor gesendet an Instanz 0xd56fd20'*

Warum tritt dieser Fehler auf? Wenn es nicht möglich ist, bin ich für Vorschläge offen.

Nochmals vielen Dank. Und tut mir leid, dass ich das ein bisschen langgezogen habe.

9voto

Anil Varghese Punkte 42669

Verwenden Sie den unten stehenden Code, um eine Ansicht aus der Nib zu laden und als Ansicht des View-Controllers zu verwenden

- (void)loadView
{ 
[super loadView];

NSArray *nib =[[NSBundle mainBundle]loadNibNamed:@"test" owner:self options:nil];
self.view = [nib objectAtIndex:0];
}  

Bearbeiten

Laden Sie eine einzelne Nib gemäß der Benutzerauswahl. Siehe Laden einer einzelnen Nib

    NSArray *nib =[[NSBundle mainBundle]loadNibNamed:@"test" owner:self options:nil];  

liefert ein Array von Objekten zurück. Aus Ihrer aktualisierten Frage geht hervor, dass Sie diese Arrays in ein weiteres Array speichern. Jetzt ist Ihr Nib-Array also ein Array von 'Array'-Objekten.

 self.view = [[nibs objectAtIndex:0]objectAtIndex:0]; 

wird funktionieren.

Aber es ist nicht gut, laden Sie eine einzelne Nib gemäß der Benutzerauswahl

1voto

svena Punkte 2739

Sie sollen keine Nib für den Ansichtscontroller aus den Methoden dieses Ansichtscontrollers laden.

Wenn Sie einen Ansichtscontroller aus einer Nib instanziieren möchten, tun Sie dies von außerhalb dieses Ansichtscontrollers, normalerweise vom Ansichtscontroller, der ihn präsentiert.

Wenn Sie nach einem Hook innerhalb des präsentierten Ansichtscontrollers suchen, der bereits die Verbindungen zu Outlets eingerichtet hat, ist das Überschreiben von -awakeFromNib eine beliebte Wahl. Eine andere Möglichkeit ist -viewDidLoad.

Aktualisierung #1

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{
   if ( /*machen Sie Ihre Segue-Identifikationsaufgaben hier*/ ) {
      UIViewController *myViewController = /*Initialisieren Sie Ihren Ansichtscontroller hier*/
      UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:myViewController];
      [self presentViewController:navigationController animated:YES completion:nil];
      return NO;
   }
   return YES;
}

1voto

voromax Punkte 3339

Sie sollten die Nib-Datei verwenden, um den Ansichtscontroller selbst zu instanziieren, d. h.

UIViewController *ctrl = [[UIViewController alloc] initWithNibName:@"Email" bundle:nil];

Danach können Sie diesen Controller präsentieren

Aktualisierung

Falls Sie festlegen müssen, welcher Ansichtscontroller durch die Anwendungslogik geladen werden soll, ist es besser, alle Ansichtscontroller in einem Storyboard zu erstellen, die harte Segue-Bindung zu überspringen und die Methode instantiateViewControllerWithIdentifier: Ihres Storyboard-Exemplars zu verwenden, um den entsprechenden Ansichtscontroller zu erhalten und ihn manuell zu präsentieren. Ich gehe davon aus, dass Ihr Tabellenansichtscontroller bereits in einem Navigationscontroller ist:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    if (APPROPRIATE_INDEX_PATH) {
        UIViewController *ctrl = [self.storyboard instantiateViewControllerWithIdentifier:IDENTIFIER];
        [self.navigationController pushViewController:ctrl animated:YES];
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X