【问题标题】:Delegation not working Swift委派不工作 Swift
【发布时间】:2016-12-24 14:40:55
【问题描述】:

我正在尝试在 Swift 上实现委托模式。该过程包含一个弹出框,该弹出框在 textView 上的文本选择中从 UIMenuItem 显示。这个弹出框是一个包含一些颜色的 TableViewController。当一个单元格(或颜色)被点击时,选定的文本将其颜色从黑色更改为选定的颜色。我在发送类中有以下协议:

protocol SelectedColorDelegate {
func didSelectColorCell(color: UIColor)
}

然后在发送类中我创建了这个属性:

var colorCellDelegate: SelectedColorDelegate?

在作为发送类的tableViewController(popover)的方法didSelectRowAtIndexPath中,我分配了所需的参数:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let color = arrayOfColorValues[indexPath.row]
    self.colorCellDelegate?.didSelectColorCell(color: color)
}

在我的 ViewController 接收类中,我设置了协议 SelectedColorDelegate,并使用此方法符合它,旨在更改 textColor:

func didSelectColorCell(color: UIColor) {
    let textRange = noteTextView.selectedRange
    let string = NSMutableAttributedString(attributedString: noteTextView.attributedText)
    string.addAttribute(NSForegroundColorAttributeName, value: color, range: textRange)
    noteTextView.attributedText = string
    noteTextView.selectedRange = textRange
}

但是最后一个方法永远不会被调用,点击弹出框的单元格什么也没做,我错过了什么或做错了什么?谢谢!! :)

【问题讨论】:

  • 你能用didSelectRowAt在函数中设置断点并检查它是否崩溃吗?
  • 您是否将 ViewController 分配给 colorCellDelegate?
  • popover?.delegate = self ;确保将这些委托分配给 Viewcontroller。
  • @AdrianBobrowski 是的,它被调用了。
  • @MarilynGarcía 好的,然后现在用didSelectRowAt 在函数中打印self.colorCellDelegate 我认为这个代表为零

标签: ios swift uitableview protocols delegation


【解决方案1】:

首先将您的协议定义为仅用于类

protocol SelectedColorDelegate: class {
    func didSelectColorCell(color: UIColor)
}

其次,我们希望我们的代表保留

weak var colorCellDelegate: SelectedColorDelegate?

当您显示其他视图或在 viewDidLoad 中时,最后设置委托,例如:

class YourViewController: SelectedColorDelegate {
    final override func viewDidLoad() {
        super.viewDidLoad()

        self.colorCellDelegate = self
    }
}

Tutorial - How To Make Weak Delegates In Swift

【讨论】:

  • 我设法找到了我的错误,但是如果我将委托设置为弱引用,编译器会抱怨,说“弱可能只适用于类和类绑定协议类型”,而不是简单的我实现的协议,所以我的协议必须是纯类类型。谢谢!
  • @MarilynGarcía 将您的协议定义为仅适用于类。寻找我编辑的答案
【解决方案2】:

在 PopOverTableViewController 中,设置应如下所示 -

class PopOverTableViewController: UITableViewController, SelectedColorDelegate {

    override func viewDidLoad() {
          super.viewDidLoad()
          self.colorCellDelegate = self
    }
}

【讨论】:

    【解决方案3】:

    你在 xxViewController 中做了:xxTableViewController.colorCellDelegate = self 吗?

    而且你的委托声明应该是弱的:

    weak var colorCellDelegate: SelectedColorDelegate?
    

    【讨论】:

    • ViewController 对 colorCellDelegate 的分配是否在 viewDidLoad() 中?
    • @MarilynGarcía,在其中创建 xxTableViewController:let xxTableViewController = XXTableViewController(); xxTableViewController.colorCellDelegate = self
    猜你喜欢
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 2014-09-26
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    相关资源
    最近更新 更多