我的问题是:
我有一个MainTableViewController,其中有一个用于使用自定义UITableViewCells的表的接口。我还在MainTableViewController中有一个用于UIView的接口,称为BlackView。
我想做的事:在myCustomCell中,我想设置“BlackView.hidden = false”。我试图在我的MainTableViewController文件中使用“class func”,并从myCustomCell中调用它,但它不起作用,因为当我将单词“class”放在“func”之前时,Xcode停止识别BlackView。
因此,我想调用MainTableViewController的函数,或者从我的.xib文件的.swift访问它的出口。
有人知道怎么做吗?
下面是我的.xib文件:
My .xib file
下面是我的.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
}
}
这是我的主故事板:
My Main.storyboard
1条答案
按热度按时间8fsztsew1#
答案是委派
BlackView是一个将由操作系统创建的示例。插座是一个引用该示例的特殊属性(称为插座)。当显示MainTableViewController时,操作系统将创建一个示例。
您可能希望使用示例方法而不是类方法来更改BlackView示例的隐藏属性。为此,您需要将MainTableViewController示例的引用传递给myCustomCell。这称为delegation,这是ios编程和大多数MVC模型的工作方式。
为此,请添加定义一个委托协议(就在自定义单元格的定义之上),并向此类型的单元格添加一个弱var:
然后,当您在cellForRowAtIndexPath中设置单元格时,请强制转换为正确的单元格类型,在您给出的示例中,该类型应为MyCustomCell,而不是PublishHeaderTableViewCell(还要注意我已经将您的自定义单元类名改为以大写字母开头,这是ios开发中的行业标准)。最后,将委托设置为MainTableViewController的示例(在示例函数中称为“self”)。
顺便说一句,在您的例子中,您只使用了一个单元格,所以您可能不需要出队和重用单元格。您可以将所有这些都去掉,并在cellForRowAtIndexPath方法中返回一个您创建的单元格的简单示例。无论如何,我将保留所有这些内容,以防您刚刚简化了堆栈溢出的代码。
最后,也是非常重要的一点,您需要声明MainTableViewController符合将使用它的协议,以便(方法)将成功。在您的情况下,它需要同时符合我们上面所写的MyCustomCellDelegate,而且因为您将它用于tableView的数据源(对于cellForRowAtIndexPath和numberOfRowsInSection),您需要声明它符合UITableViewDataSource(您可能已经通过接口生成器(情节提要)完成了此操作..如果没有,您可以在类定义中完成此操作)。
最后要说明的是,我不确定在自定义单元格的awakeFromNib方法中设置UITextView的委托是否合适。我知道此方法并不总是触发。在您的情况下,由于它位于插座上,我认为这是可以的,但我自己并不经常使用XIB文件,因此您可能希望打印到控制台以确保每次都调用它,或进一步研究此问题。