swift2 Swift -从自定义UITableViewCell调用UIViewController的函数

aiqt4smr  于 2022-11-06  发布在  Swift
关注(0)|答案(1)|浏览(231)

我的问题是:
我有一个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

8fsztsew

8fsztsew1#

答案是委派

BlackView是一个将由操作系统创建的示例。插座是一个引用该示例的特殊属性(称为插座)。当显示MainTableViewController时,操作系统将创建一个示例。
您可能希望使用示例方法而不是类方法来更改BlackView示例的隐藏属性。为此,您需要将MainTableViewController示例的引用传递给myCustomCell。这称为delegation,这是ios编程和大多数MVC模型的工作方式。
为此,请添加定义一个委托协议(就在自定义单元格的定义之上),并向此类型的单元格添加一个弱var:

// 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中设置单元格时,请强制转换为正确的单元格类型,在您给出的示例中,该类型应为MyCustomCell,而不是PublishHeaderTableViewCell(还要注意我已经将您的自定义单元类名改为以大写字母开头,这是ios开发中的行业标准)。最后,将委托设置为MainTableViewController的示例(在示例函数中称为“self”)。
顺便说一句,在您的例子中,您只使用了一个单元格,所以您可能不需要出队和重用单元格。您可以将所有这些都去掉,并在cellForRowAtIndexPath方法中返回一个您创建的单元格的简单示例。无论如何,我将保留所有这些内容,以防您刚刚简化了堆栈溢出的代码。

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(您可能已经通过接口生成器(情节提要)完成了此操作..如果没有,您可以在类定义中完成此操作)。

// 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文件,因此您可能希望打印到控制台以确保每次都调用它,或进一步研究此问题。

相关问题