2017-09-01 3 views
1

Ich habe eine Tabellenansicht mit expandierenden Zellen. Die expandierenden Zellen stammen aus einer XIB-Datei. In der Klasse der Tabelle befindet sich der gesamte Code, der die Expansions- und Pull-Daten von plist steuert. Ich versuche, eine Schließen-Schaltfläche hinzuzufügen, möchte sie aber nur anzeigen, wenn die Zelle erweitert ist. Wie es aussieht, kann ich nicht auf die Schaltfläche verweisen, um es zu verbergen, weil es in einer anderen Klasse ist. Hier ist, wie ich versuche, darauf zuzugreifen:Objekt kann nicht von einer anderen Klasse aufgerufen werden

import UIKit 

class SecondPolandViewController: UIViewController { 
    @IBOutlet weak var tableView: UITableView! 

    var customTableViewCell:CustomTableViewCell? = nil 
    var items = [[String:String]]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     **REFERENCING CLASS** 

     customTableViewCell = CustomTableViewCell() 

     let nib = UINib.init(nibName: "CustomTableViewCell", bundle: nil) 
     self.tableView.register(nib, forCellReuseIdentifier: "cell") 

     self.items = loadPlist() 
    } 

    func loadPlist()->[[String:String]]{ 
     let path = Bundle.main.path(forResource: "PolandResourceList", ofType: "plist") 

     return NSArray.init(contentsOf: URL.init(fileURLWithPath: path!)) as! [[String:String]] 
    } 

    var selectedIndex:IndexPath? 
    var isExpanded = false 

    func didExpandCell(){ 
     self.isExpanded = !isExpanded 
     self.tableView.reloadRows(at: [selectedIndex!], with: .automatic) 
    } 
} 

extension SecondPolandViewController:UITableViewDataSource, UITableViewDelegate{ 
    ***HIDING BUTTON*** 

    let button = customTableViewCell?.closeButton 
    button?.isHidden = true 

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     self.selectedIndex = indexPath 
     self.didExpandCell() 
    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return self.items.count 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomTableViewCell 

     cell.selectionStyle = .none 

     let item = self.items[indexPath.row] 
     cell.titleLabel.text = item["title"] 
     cell.shortLabel.text = item["short"] 
     cell.otherImage.image = UIImage.init(named: item["image"]!) 
     cell.thumbImage.image = UIImage.init(named: item["image"]!) 
     cell.longLabel.text = item["long"] 

     return cell 
    } 

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
     let height = UIScreen.main.bounds.height 

     if isExpanded && self.selectedIndex == indexPath{ 
      //return self.view.frame.size.height * 0.6 
      return 400 
     } 

     return 110 
     //return height * 0.2 
    } 
} 

Dies versteckt es jedoch nicht.

Hier ist die Xib, die ich rufe, wenn es hilft. Es ist wahrscheinlich einfach, ich bin nur ein selbsternannter Entwickler.

import UIKit 

class CustomTableViewCell: UITableViewCell { 
    @IBOutlet weak var closeButton: UIImageView! 
    @IBOutlet weak var otherImage: UIImageView! 
    @IBOutlet weak var thumbImage: UIImageView! 
    @IBOutlet weak var titleLabel: UILabel! 
    @IBOutlet weak var shortLabel: UILabel! 
    //@IBOutlet weak var longLabel: UITextView! 
    @IBOutlet weak var longLabel: UITextView! 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     // Initialization code 
     //let width = UIScreen.main.bounds.width 
     //let height = UIScreen.main.bounds.height 
     //thumbImage.frame.size.width = height * 0.19 
     //thumbImage.frame.size.height = height * 0.19 
    } 
} 

How it is now with circle that should be hidden. It's just an image not a button

enter image description here

+0

Sie bekommen den Knopf oben auf der Erweiterung und stellen Sie es auf versteckt? Kompiliert das? Nun, würde die Schaltfläche in der CellForRow atIndexPat Func versteckt, wenn IndexPath nicht identisch mit dem ausgewählten ist. Dies sollte den Trick tun. –

Antwort

0

Es scheint wie, dass Sie gerade diese Zeilen in cellForRowAt:indexPath Methode hinzufügen müssen:

if indexPath == selectedIndexPath { 
    cell.closeButton.isHidden = false 
} else { 
    cell.closeButton.isHidden = true 
} 

Sie kostenlos in Sie direkt vor return Linie

+0

Danke. Stattdessen musste ich verwenden, wenn isExpanded && self.selectedIndex == indexPath { cell.closeButton.isHidden = false } else { cell.closeButton.isHidden = true } Funktioniert jetzt. –

0

Die normale iOS Antwort dafür ist ein Delegierter, aber man konnte mit einem einfachen Verschluss in diesem Fall weg.

In CustomTableViewCell, fügen

public var closeTapped: ((CustomTableViewCell) ->())? 

Dann in dieser Klasse, wenn in der Nähe, rufen abgegriffen

self.closeTapped?(self) 

Im VC, in cellForRowAt,

cell.closeTapped = { cell in 
    // do what you want with the VC 
} 

Für Teilnehmer, Dies könnte helfen: https://medium.com/@jamesrochabrun/implementing-delegates-in-swift-step-by-step-d3211cbac3ef

Die schnelle Antwort, warum Delegierte über die Schließung bevorzugen, ist, dass es eine praktische Möglichkeit ist, eine Reihe von diesen zusammen zu gruppieren. Es ist was UITableViewDelegate ist (was Sie verwenden). Außerdem ist es ein gängiges iOS-Idiom.

Ich schrieb über hier: https://app-o-mat.com/post/how-to-pass-data-back-to-presenter für eine ähnliche Situation (VC VC-Kommunikation)

+0

Ich denke, er wollte den CancelButton ausblenden, wenn die Zelle nicht erweitert wird. –

+0

Was auch immer sie tun müssen, sie können in dieser Schließung tun –

+0

aber was machst du mit dem Fiest Staat? Wenn alles geschlossen ist. Es gibt keine Funktion, die den Knopf zeigt –

Verwandte Themen