2016-07-21 21 views
1

Ich verwende DZNEmptySet, um zu laden, wenn in einem UITableView nichts angezeigt werden soll. Es funktioniert gut für DZNEmptySet Methoden wie titleForEmptyDataSet, imageForEmptyDataSet, aber nicht die, die ich verwenden möchte (das ist customViewForEmptyDataSet).Initialisierung einer XIB in der Unteransicht eines UIViewControllers

Wenn ich versuche, die Xib in die scrollView.frame zu laden, beginnt Xcode Speicher in 30 Megabyte-Schritten aufgebläht und die App hängt. Ich weiß, ich bin schuld, aber ich weiß nicht, was ich vermasselt habe.

Ich habe mir viele Antworten hier und Tutorials auf anderen Seiten angesehen, aber ich kann keine Lösung finden, die für diesen Umstand funktioniert (was ich denke, ist ziemlich einfach). Jede Rückmeldung an dieser Front würde sehr geschätzt werden.

Hier customViewForEmptyDataSet auf MyViewController

// App hangs on this and memory bloats in 30 megabyte increments. 
func customViewForEmptyDataSet(scrollView: UIScrollView!) -> UIView! { 
    return EmptySetView(frame: scrollView.frame) 
} 

Hier ist die Klasse für meine EmptySetView, dass ich zu initialisieren bin versucht:

import UIKit 

class EmptySetView: UIView { 
    var view: UIView! 
    // These are connected to a xib 
    @IBOutlet weak var backgroundImageView: UIImageView! 
    @IBOutlet weak var viewLabel: UILabel! 
    @IBOutlet weak var viewTextView: UITextView! 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     setup() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     setup() 
    } 

    func setup() { 
     view = loadViewFromNib() 
     view.frame = bounds 
     view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight] 
     self.addSubview(self.view) 
    } 

    func loadViewFromNib() -> UIView { 
     let bundle = NSBundle(forClass:self.dynamicType) 
     let nib = UINib(nibName: "EmptySetView", bundle: bundle) 
     let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView 

     return view 
    } 
} 

aktualisieren

Bei Matt's suggestion untersuchte ich Rekursion I erlebt und entdeckt die Ursache des Problems.

Sie geben die UIView-Klasse nicht für View für Ihre Xib an. Stattdessen klicken Sie auf den gelben Cube mit dem Titel File's Owner und geben Sie UIView dort, das Klassenfeld leer in der Ansicht in der Dokumentgliederung Feld verlassen.

enter image description here

Nach Caches Reinigung und Wiederaufbau, kann ich die Ansichten in der Hierarchie mit diesem Code auf MyViewController genannt zu laden:

func customViewForEmptyDataSet(scrollView: UIScrollView!) -> UIView! { 
    let emptySetView = EmptySetView(frame: scrollView.frame) 
    return emptySetView 
} 

Die EmptySetView xib und MyViewController wissen nicht, über die jeweils Andere, bis die Xib geladen ist, müssen Sie mit Layout-Einschränkungen umgehen.

+0

von wo aus rufen Sie 'customViewForEmptyDataSet' – Miknash

+0

Verwenden Sie Instrumente. Es zeigt Ihnen sofort, was die Ursache des Problems ist. Sie können beobachten, wie der Speicher wächst, und die Aufrufkette anzeigen, die ihn verursacht. – matt

+0

@NickCatib 'customViewForEmptyDataSet' ist eine Delegate-Methode, die aufgerufen wird, wenn' tableView' leer ist. – Adrian

Antwort

1

Meine Vermutung ist, dass in der Spitze, die Sie laden, die Top-Level-Ansicht ist ein EmptySetView. Dies verursacht eine Rekursion. Sie beginnen mit dem EmptySetView in Code instanziieren:

override init(frame: CGRect) { 
    super.init(frame: frame) 
    setup() 
} 

In setup(), können Sie die Spitze laden. Aber das führt dazu, dass ein EmptySetView wieder von der Spitze instanziiert wird. Dieses Mal wird der andere initializer genannt:

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
    setup() 
} 

Aber setup() lädt die Spitze, so dass wir jetzt im Kreis herum, zu nisten versuchen, eine unendliche Anzahl von nib belasteten Ansichten ineinander wie Matrushka Puppen.

+0

Danke! Ich habe einige Fortschritte gemacht, um das Rekursionsproblem zu lösen. Die Ansicht wird jetzt geladen, aber die auf der xib angegebenen automatischen Layouteinschränkungen scheinen beim Laden nicht berücksichtigt zu werden. Ich habe meine Frage aktualisiert. – Adrian

+0

Es tut mir leid, aber das fühlt sich für mich nicht wie ein Update an: es ist eine ganz andere Frage. Es scheint, dass meine Antwort richtig war; Ich finde, du solltest es akzeptieren. Wenn Sie dann ein neues Problem haben, stellen Sie es als eine andere Frage und ich werde froh sein zu helfen, wenn ich kann. Sonst lechzt du nur - verwandelst deine Frage in ein bewegliches Ziel, von dem niemand das "akzeptierte" Häkchen bekommen kann und um mehr und mehr Hilfe "umsonst" zu bitten. – matt

+0

Denken Sie daran, wenn ich Ihre Antwort zum Hinzufügen bearbeiten, sollte überprüfen, dass der Dateibesitzer die UIView-Klasse angibt, nicht die Ansicht in der Xib? Das hat die Rekursion verursacht. – Adrian