这是我的问题:
我有一个MainTableViewController,它有一个使用自定义UITableViewCells的表的插座。我还在MainTableViewController中有一个名为BlackView的UIView插座。
我想做什么:在myCustomCell里面我想设置“BlackView.hidden = false”。我正在尝试在我的MainTableViewController文件中使用“class func”,并从myCustomCell调用它,但它不起作用,因为当我在“func”之前放置单词“class”时Xcode停止识别BlackView。
所以,我想调用MainTableViewController的函数或从我的.xib文件的.swift访问它的出口。
有人知道该怎么做吗?
这是我的.xib文件:
这是我的.xib文件的.swift:
class myCustomCell: UITableViewCell {
@IBOutlet weak var commentTextView: UITextView!
override func awakeFromNib() {
commentTextView.delegate = self
super.awakeFromNib()
}
func textViewDidBeginEditing(textView: UITextView) {
MainTableViewController.hideBlackView(true)
}
func textViewDidEndEditing(textView: UITextView) {
var comment = commentTextView.text
}
}
这是我的MainTableViewController:
class MainTableViewController: UIViewController
@IBOutlet weak var MyTable: UITableView!
@IBOutlet weak var BlackView: UIView!
override func viewDidLoad() {
BlackView.hidden = true;
MyTable.registerNib(UINib(nibName: "myCustomCell", bundle: nil), forCellReuseIdentifier: "myCustomCellID")
}
class func hideBlackView(setToHidden: Bool) {
if setToHidden == true {
BlackView.hidden = true
} else {
BlackView.hidden = false
}
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("myCustomCellID") as! PublishHeaderTableViewCell
cell.selectionStyle = UITableViewCellSelectionStyle.None
return cell
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
}
这是我的Main.storyboard:
答案 0 :(得分:4)
答案是代表团
BlackView是一个将由操作系统创建的实例。插座是引用该实例的特殊属性(称为插座)。当显示MainTableViewController时,操作系统会创建它的实例。
您可能希望使用实例方法,而不是类方法来更改BlackView实例上的隐藏属性。为此,您需要将MainTableViewController实例的引用传递给myCustomCell。这称为委托,这是ios编程和大多数MVC模型的工作方式。
要执行此操作,请添加定义委托协议(在自定义单元格的定义上方是正常的)并将弱变量添加到此类型的单元格中:
// use a class protocol for delegates so weak properties can be used
protocol MyCustomCellDelegate: class {
func hideBlackView(setToHidden: Bool)
}
class MyCustomCell: UITableViewCell {
@IBOutlet weak var commentTextView: UITextView!
weak var delegate: MyCustomCellDelegate?
override func awakeFromNib() {
commentTextView.delegate = self
super.awakeFromNib()
}
func textViewDidBeginEditing(textView: UITextView) {
delegate?.hideBlackView(true)
}
func textViewDidEndEditing(textView: UITextView) {
var comment = commentTextView.text
}
}
然后当你在cellForRowAtIndexPath中设置单元格时,在你给出的不是PublishHeaderTableViewCell的示例中,将其转换为应该是MyCustomCell的正确单元格类型(另请注意,我已将自定义单元格类名称切换为以大写字母是ios开发中的行业标准)。最后,将委托设置为MainTableViewController的实例(在实例函数中称为“self”)。
顺便说一下,在你的情况下,你只使用一个单元格,所以你可能不需要出列并重用单元格。你可以把所有这些拿出来并返回你在cellForRowAtIndexPath方法中创建的单元格的简单实例。无论如何,如果您刚刚简化了Stack Overflow的代码,我会留下所有这些。func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
// you need to cast the cell to your custom class to use it
let cell = tableView.dequeueReusableCellWithIdentifier("myCustomCellID") as! MyCustomCell
cell.selectionStyle = UITableViewCellSelectionStyle.None
// set the delegate
cell.delegate = self
return cell
}
最后,非常重要的是,您需要声明MainTableViewController符合将使用它的协议,以便其他对象想要委托给它的函数(方法)将成功。在你的情况下,它需要符合我们上面写的MyCustomCellDelegate,但是因为你将它用于tableView的数据源(对于cellForRowAtIndexPath和numberOfRowsInSection),你需要声明它符合UITableViewDataSource(你可能已经这样做了)已经通过Interface Builder(故事板)..如果没有,你可以在类定义中完成。)
// Declare objects conform to protocols by including protocol names separated by commas after the colon (or the class inherited from)
class MainTableViewController: UIViewController, MyCustomCellDelegate, UITableViewDataSource {
@IBOutlet weak var MyTable: UITableView!
@IBOutlet weak var BlackView: UIView!
override func viewDidLoad() {
BlackView.hidden = true
MyTable.registerNib(UINib(nibName: "myCustomCell", bundle: nil), forCellReuseIdentifier: "myCustomCellID")
}
func hideBlackView(setToHidden: Bool) {
// since they are both bools just set BlackView.hidden to the setToHidden parameter directly
BlackView.hidden = setToHidden
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("myCustomCellID") as! MyCustomCell
cell.selectionStyle = UITableViewCellSelectionStyle.None
// set the delegate
cell.delegate = self
return cell
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
}
作为最后一点,我不确定是否在自定义单元格中的awakeFromNib方法中设置UITextView的委托是合适的。我知道这种方法并不总是解决..在你的情况下,因为它在一个插座上,我认为它没关系,但我不太喜欢使用XIB文件,所以你可能想要打印到控制台确保每次调用它或更多地研究问题。