Swift - 从Custom UITableViewCell调用UIViewController的func

时间:2016-07-23 22:44:14

标签: swift xcode swift2

这是我的问题:

我有一个MainTableViewController,它有一个使用自定义UITableViewCells的表的插座。我还在MainTableViewController中有一个名为BlackView的UIView插座。

我想做什么:在myCustomCell里面我想设置“BlackView.hidden = false”。我正在尝试在我的MainTableViewController文件中使用“class func”,并从myCustomCell调用它,但它不起作用,因为当我在“func”之前放置单词“class”时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

    }

}

这是我的Main.storyboard:

My Main.storyboard

1 个答案:

答案 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文件,所以你可能想要打印到控制台确保每次调用它或更多地研究问题。