2013-09-23 4 views
6

Ich habe eine UICollectionViewController Verwaltung einer Sammlungsansicht, die verschiedene Layouts für verschiedene App-Status verwendet. Ich verwende -setCollectionViewLayout:animated:, um zwischen den verschiedenen Layouts zu wechseln. Ich habe einen schlechten Zugriffsfehler, und es würde immens helfen zu wissen, was tatsächlich besitzt (z. B. hält eine strong Referenz auf) das aktuelle Layout der Kollektionsansicht.UICollectionViewController-Layoutbesitz (self.collectionView.collectionViewLayout vs. self.collectionViewLayout)

Nach -setCollectionViewLayout:animated: Aufruf, habe ich folgendes bemerkt (wo self ist die UICollectionViewController):

  • self.collectionView.collectionViewLayout das neue Layout zurück.
  • gibt immer noch das alte Layout zurück.

Dies führte mich die UICollectionView Class Reference zu überprüfen, die dieses Verhalten erklärt:

collectionViewLayout

Das Objekt Layout verwendet initialisieren die Sammlung View-Controller. (Read-only)

@property (nonatomic,readonly) UICollectionViewLayout *collectionViewLayout

Diskussion
Diese Eigenschaft enthält das Layout Objekt, das Sie an die initWithCollectionViewLayout geben: Methode. Das Layoutobjekt in dieser Eigenschaft wird nicht aktualisiert, um Änderungen an der Sammlungsansicht selbst anzuzeigen. Sie können diese Eigenschaft verwenden, um auf das Layoutobjekt zu verweisen, für das Sie ursprünglich die zu verwendende Auflistungsansicht konfiguriert haben.

Okay. So self.collectionViewLayout ist eine schwache Referenz (oder ist es?) Auf das ursprüngliche Layout und self.collectionView.collectionViewLayout ist eine starke Bezugnahme auf das aktuelle Layout.

Um dies zu bestätigen, nahm ich einen Tauchgang in den Debugger, aber war von der UICollectionViewController im Besitz der tatsächlichen UICollectionView angeblich nicht finden können. Stattdessen war die Variable _view des Sammlungsansicht-Controllers eine Instanz von UICollectionViewControllerWrapperView. Whaaat?

Diese ganze Erfahrung hat mich mit den folgenden Fragen:

  1. Wo ist die tatsächliche UICollectionView in einem UICollectionViewController gespeichert?
  2. Bewirkt self.collectionViewLayout eine strong Referenz auf das ursprüngliche Layout?

Antwort

0

Wo ist die tatsächliche UICollectionView in einem UICollectionViewController gespeichert?

Das geht Sie wirklich nichts an. Ich meine, es ist interessant, dass Sie einen Zeiger auf die Sammlungsansicht gefunden haben, und Sie könnten wahrscheinlich einen anderen finden, indem Sie die Ansichtshierarchie des Controllers durchsuchen. Die wichtige Sache ist, dass Sie UICollectionViewController sich Sorgen um die Sammlungsansicht machen sollten. Ich weiß, dass das keine befriedigende Antwort ist, wenn Sie herausfinden wollen, warum Ihre App abstürzt, aber abgesehen von der Fehlersuche ist es immer eine gute Idee, sich nicht mit den Ansichten eines View-Controllers herumzuärgern.

Behält sich self.collectionViewLayout einen starken Bezug zum ursprünglichen Layout?

aus der Dokumentation zu urteilen, ja. Objective-C-Eigenschaften sind strong by default, und Sie können aus der Eigenschaftsspezifikation sehen, dass die collectionViewLayout-Eigenschaft weak nicht angibt, also muss es strong sein.

Weitere Hinweise stammen aus der von Ihnen zitierten Dokumentation, die im Grunde besagt, dass die Eigenschaft einen Zeiger auf das Layout bereitstellt, das Sie bei der Initialisierung angegeben haben. Es heißt nicht, dass die Eigenschaft nil zurückgibt, wenn Sie das Layout ändern - es ist aus dem Weg zu sagen, dass die Eigenschaft nicht aktualisiert wird und weiterhin auf das ursprüngliche Layout zeigt, auch wenn Sie das Layout ändern.

2

Okay, habe ich bereits beantwortet meine erste Frage: UICollectionViewControllerWrapperView eine Ivar hat _subviewCache genannt, die ein veränderliches Array ist die tatsächliche UICollectionView bei Index 0. Schräge enthält.

Allerdings würde ich immer noch eine Antwort auf meine zweite Frage lieben. Es scheint mir, dass die Sammlung Ansicht Controller ist nicht einen starken Bezug auf das ursprüngliche Layout, weil seine collectionViewLayout (initial Layout) -Eigenschaft readonly, und ich kann keinen Verweis auf eine Sammlung Ansicht Layout beim Inspizieren der Sammlung finden View Controller in der Variablensicht des Debuggers. Ist dies der Fall, Wie hält es das ursprüngliche Layout fest, obwohl die starke Referenz der Sammlungsansicht auf das ursprüngliche Layout durch eine starke Referenz auf ein anderes Layout ersetzt wurde?


Update: Es stellt sich die bad-Zugang Absturz I durch eine etwas andere Frage tatsächlich verursacht wurde sah, die mit UIDynamicAnimator ‚s Eigentum des Layouts zu tun hat. Das ist fast definitiv ein Bug in Apples Code, und ich habe ein Radar eingereicht, die Sie hier lesen können (Vervielfältigungen erlaubt!):

http://www.openradar.me/15062440

Das heißt, keiner von technisch-Adressen meine zweite Frage. Es ist für mich oder meine Arbeit nicht mehr relevant, aber ich würde immer noch echte Antworten begrüßen und auffrischen, selbst wenn sie zu diesem Zeitpunkt rein akademisch wären.

Verwandte Themen