Laden von UIView aus einer Nib-Datei ohne Vermutungen

7

Ok, hier ist eine andere Frage.

Ich erstelle eine UIView namens ProgressView , die eine halbtransparente Ansicht mit einem Aktivitätsindikator und einer Fortschrittsleiste ist.

Ich möchte diese Ansicht bei Bedarf in verschiedenen View-Controllern in meiner App verwenden können.

Ich kenne drei verschiedene Möglichkeiten, dies zu tun (aber ich bin nur an einem interessiert):

1) Erstellen Sie die gesamte Ansicht programmatisch, instanziieren und konfigurieren Sie wie erforderlich. Keine Sorge, ich bekomme das.

2) Erstellen Sie den UIView in Interface Builder, fügen Sie die erforderlichen Objekte hinzu und laden Sie sie mit einer der folgenden Methoden. Das Problem ist, dass wir im Grunde raten, dass die Ansicht der objectAtIndex ist: 0, weil ich nirgendwo in der Dokumentation einen Verweis auf die Reihenfolge der Elemente fand, die von der Funktion [[NSBundle mainBundle] loadNibName: zurückgegeben wurden.

%Vor%

3) Unterklasse UIViewController und lassen Sie es wie normal verwalten. In diesem Fall würde ich den View-Controller eigentlich nie auf den Stack schieben, sondern nur seine Hauptansicht:

%Vor%

Soweit ich das beurteilen kann, ist # 3 die richtige Art, dies zu tun (außer programmatisch), aber ich bin mir nicht ganz sicher, ob es sicher ist, den ViewController von ProgressView freizugeben, während die Ansicht eines anderen Controllers seine Hauptansicht behält (Bauchgefühl sagt, es wird undicht?)?

Was mache ich in diesem Fall hinsichtlich der Speicherverwaltung, wo und wann sollte ich den View-Controller von ProgressView freigeben?

Vielen Dank im Voraus für Ihre Gedanken.

Prost,

Rog

    
Rog 24.03.2011, 02:00
quelle

4 Antworten

10

Ich denke, dass Ihre Lösung # 3 unnötige Komplexität mit sich bringt, indem Sie eine UIViewController-Instanz als Container für Ihre ProgressView-Software einführen, damit Sie die Nib-Bindungen einrichten können. Während ich denke, dass es schön ist, mit einer IBOutlet-gebundenen Eigenschaft arbeiten zu können, anstatt die Nib-Inhalte zu durchlaufen, können Sie dies tun, ohne einen UIViewController einzuführen, dessen Verhalten Sie weder brauchen noch wollen. Dadurch vermeiden Sie Verwirrung darüber, wie und wann der View-Controller freigegeben werden soll und welche Nebenwirkungen die Responder-Kette oder andere Verhaltensweisen der geladenen Ansicht gegebenenfalls haben.

Stattdessen überdenken Sie bitte die Verwendung von NSBundle und nutzen Sie die Vorteile dieses Arguments owner .

%Vor%

Erstellen Sie eine Nib mit dem Namen "ProgressView", die eine ProgressView enthält, und legen Sie deren Owner-Klasse auf ProgressViewContainer fest. Jetzt können Sie ProgressViews erstellen, die von Ihrer Spitze geladen werden.

%Vor%

Wenn Sie mehrere Konfigurationen Ihrer Fortschrittsanzeige haben, möchten Sie vielleicht eine -initWithNibNamed: -Methode für ProgressView anstelle von +newProgressView implementieren, damit Sie angeben können, welche Spitze Sie zum Erstellen jeder ProgressView-Instanz verwenden möchten.

    
Jonah 24.03.2011, 07:25
quelle
3

Ich stimme für Option # 2. Der Rückgabewert von - [NSBundle loadNibNamed] ist ein Array der Objekte auf oberster Ebene. Solange Sie nur ein Top-Level-Objekt in der Spitze haben, ist der Index 0 korrekt. Die anderen Ansichten sind Unteransichten und keine Objekte der obersten Ebene.

Eine andere Option ist natürlich, etwas wie eine Superklasse für alle View-Controller zu erstellen, die ein Outlet namens "progressView" enthält und dann Ihre Ansicht mit dem Outlet des Eigentümers der Datei in der nib verbindet. Scheint aber Overkill dafür.

    
Firoze Lafeer 24.03.2011 03:31
quelle
3

Ich bevorzuge auch Alternative # 2. Wenn die "0" dich stört, könntest du:

  • Erstellen Sie eine Unterklasse von UIView namens ProgressView
  • Erstellen Sie eine Nib-Datei namens ProgressView.xib, die Ihre Fortschrittsansicht beschreibt.
  • Wählen Sie die oberste Ansicht in Ihrer Schreibschrift aus, und legen Sie im Interface-Builder
  • die Klasse für ProgressView fest

tue es dann

%Vor%     
jake_hetfield 12.04.2012 13:29
quelle
3

Ich habe am Ende eine Kategorie zu UIView hinzugefügt:

%Vor%

Erklärung hier: Ссылка

    
gngrwzrd 17.03.2013 00:23
quelle