我有一个扩展单元格的表视图。扩展单元格来自xib文件。在表的类中,所有代码都控制着plist的扩展和提取数据。我正在尝试添加一个关闭按钮,但只希望它在细胞扩展时显示。就目前而言,我无法引用该按钮来隐藏它,因为它在另一个类中。以下是我尝试访问它的方式:
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
}
}
但这并不隐藏它。
如果有帮助的话,这是我打电话的xib。这可能很简单,我只是一个新近自学的开发人员。
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
}
}
答案 0 :(得分:0)
正常的iOS答案是委托,但在这种情况下你可以通过一个简单的闭包来解决。
在CustomTableViewCell
中,添加
public var closeTapped: ((CustomTableViewCell) -> ())?
然后在该课程中,当点击关闭时,请致电
self.closeTapped?(self)
在VC中,在cellForRowAt中,
cell.closeTapped = { cell in
// do what you want with the VC
}
对于代表来说,这可能有所帮助:https://medium.com/@jamesrochabrun/implementing-delegates-in-swift-step-by-step-d3211cbac3ef
为什么更喜欢代表而不是关闭代码的快速答案是它将一组这些组合在一起的方便方法。这就是UITableViewDelegate(你正在使用它)。此外,这是一个常见的iOS习语。
我在这里写到:https://app-o-mat.com/post/how-to-pass-data-back-to-presenter用于类似情况(VC到VC通信)
答案 1 :(得分:0)
您似乎只需将这些行添加到cellForRowAt:indexPath
方法中:
if indexPath == selectedIndexPath {
cell.closeButton.isHidden = false
} else {
cell.closeButton.isHidden = true
}
您可以在return
行