2017-08-24 1 views
0

Ich habe eine UITableViewController mit einer Liste von benutzerdefinierten UITableViewCells. Die Zelle hat Text, der manchmal lang ist. Ich schneide das bei 2 Zeilen in der Tabelle ab.Benutzerdefinierte UITableViewCell in eine andere benutzerdefinierte UIView einbetten?

Wenn ein Benutzer die Zelle berührt, mag ich mit den exakt gleichen Informationen wie die UITableViewCell, mit dem Zusatz eines Header über den UITableViewCell Inhalt ein UIView als Popup erstellen. Also, im Wesentlichen, möchte ich etwas wie folgt aus: enter image description here

ich VersePopupView gerade gebaut haben, wie im Bild angezeigt, in dem der Text „Benutzerdefinierte Kopfzeile“ ist eigentlich ein UILabel. Ich habe die Ansicht aus der XIB-Datei instanziiert und erfolgreich den UILabel-Text festgelegt, aber die benutzerdefinierte UITableViewCell wird nicht angezeigt, obwohl ich auch diesen Wert zugewiesen habe. Meine IBOutlet s sind alle an IB angeschlossen.

Hier ist meine Instanziierung:

 let popupView: VersePopupView = VersePopupView.instanceFromNib() 
     popupView.frame = CGRect(x: 10, y: 100, width: 300, height: 100) 
     popupView.assignVerseTableViewCell(cell: cell) 

     window.addSubview(popupView) 
     window.makeKeyAndVisible() 

Und hier meine VersePopupView Klasse:

class VersePopupView: UIView { 

    @IBOutlet weak var cell: VerseTableViewCell! 
    @IBOutlet weak var title: UILabel! 
    @IBOutlet weak var headerView: UIView! 

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

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

    class func instanceFromNib() -> VersePopupView { 
     return UINib(nibName: "VersePopupView", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! VersePopupView 
    } 


    func assignVerseTableViewCell(cell: VerseTableViewCell) 
    { 
     // Assign it 
     self.cell = cell 

     // Get the verse details 
     if let verseDetails = cell.verse_details { 

      self.title.text = verseDetails.verseReference() 

      // Adjust the frame 

      // Adjust the text to be attributed text 

      // Set the title to the verse reference 

      // Anything else? 

     } 
    } 
} 

Was mache ich falsch, so dass die UITableViewCell nicht nach oben zeigt?

Gibt es dafür ein besseres Muster, als die UITableViewCell einzubetten?

Ich möchte Code (den ich in der Vergangenheit getan habe) nicht duplizieren, weil ich will, dass der Benutzer mit dem Popup genau wie sie in der Tabellenzelle interagieren würde.

+0

Versuchen Sie nicht, eine Tabellenansicht Zelle außerhalb einer Tabellenansicht zu verwenden ... – matt

+0

@matt - warum nicht? Welches Muster sollte ich dann verwenden? Wie vermeide ich es, alle UI-Elemente und Interaktionen mit diesen Elementen zu duplizieren? Ich kann das 'UITableViewCell' als ein Popup von selbst gut sehen. Wenn ich den zusätzlichen Header nicht brauchen würde, wäre ich gut. Aber ich brauche auch den Header. – thephatp

+0

Nicht sicher, was Sie über die "Interaktionen" meinen. Dies ist keine View-Controller-Ansicht, sodass Sie keine Verbindung zu etwas außerhalb des View-Controllers herstellen können. Wie auch immer, wenn ich es wäre, hätte ich eine Ansicht xib und blicke in die Inhaltsansicht der Zelle und in die andere Ansicht. – matt

Antwort

2

Ich bin nicht sicher, wie Sie zu überzeugen, wie einfach dies ohne zu tun ist, zu versuchen, eine Tabellenansicht Zelle zu missbrauchen, so ist hier ein Screenshot:

enter image description here

Sie nur mir glauben müssen wenn ich sage, dass das eine dreireihige Tabelle ist, gefolgt von einer völlig unabhängigen gewöhnlichen Ansicht, die aus dem Inneren der Tabellenansichtszelle gezupft wird (durch Laden der Zellenspitze).

Sie sehen nicht nur identisch aus, sie wirken identisch; Die Ansicht ist eine benutzerdefinierte UIView-Unterklasse mit einer Aktionsmethode vom Switch, und wenn ich auf den Schalter klicke, löst sie diese Aktionsmethode aus, sowohl innerhalb der Tabelle als auch außerhalb davon.

Die Ansicht wurde vollständig in der Spitze entworfen, und absolut kein Code wurde wiederholt.

Das scheint die Art von Sache zu sein, die Sie tun möchten. Also, ich ermutige Sie, nicht Tabellenansicht Zellen missbrauchen; tue dies mit einer gewöhnlichen Ansicht, die glücklich in einer Zelle oder außerhalb davon leben kann.

+0

Wenn ich das über IB erstelle, gibt es eine Möglichkeit, die benutzerdefinierte Ansicht anzuzeigen, wenn ich diese benutzerdefinierte Ansicht dem Tabellenansichtszellenprototyp in IB hinzufüge? – thephatp

+0

Das habe ich gemacht. Ich entwarf die benutzerdefinierte Ansicht _in_ der Zelle. Ich denke, ich habe das in meiner Antwort gesagt ... und es taucht auf. – matt

+0

Was ich meine ist, dass ich es an zwei Orten verwenden möchte und es an beiden Orten in IB erscheinen lassen, ohne dass du duplizieren musst. So sicher, wo auch immer ich die UI entwickle, wird alles sichtbar sein. Aber wenn ich versuche, diese neue Ansicht in eine andere Ansicht einzufügen, sind keine der Beschriftungen oder Bilder vorhanden. Ich kann die Klasse "MyCustomView" zuweisen, aber keines der Felder befindet sich in IB in dieser neuen Ansicht. – thephatp

Verwandte Themen