Swift subViewA如何更改subviewB上的参数?

Swift subViewA如何更改subviewB上的参数?,swift,uiview,uiviewcontroller,selector,Swift,Uiview,Uiviewcontroller,Selector,我用 我在类标题视图中创建了一个按钮 class HeadStackView: UIView { var deal3Card: UIButton = UIButton.init() override func draw(_ rect: CGRect) { setDeal3Card() } private func setDeal3Card () { let leftButtonFrame : CGRect = CGRect(x: bounds.maxX/15

我用

我在类标题视图中创建了一个按钮

class HeadStackView: UIView 
{
  var deal3Card: UIButton = UIButton.init()

  override func draw(_ rect: CGRect) {
    setDeal3Card()
  }

  private func setDeal3Card () {
    let leftButtonFrame : CGRect = CGRect(x: bounds.maxX/15, y: bounds.maxY/6, width: bounds.maxX/3, height: bounds.maxY*0.7)
    deal3Card = UIButton.init(frame: leftButtonFrame)
    deal3Card.backgroundColor = UIColor.purple
    deal3Card.setTitle("Deal 3 Cards", for: .normal)
    deal3Card.addTarget(self, action: #selector(ViewController.touchDeal3Card), for: .touchUpInside)
    addSubview(deal3Card)
}
在GridView.swift中

class GridView: UIView 
{
  var cellCount: Int = 5 {didSet { setNeedsDisplay(); setNeedsLayout()}}

  override func layoutSubviews() {
    super.layoutSubviews()
    drawGrid() // it draws cellCount of cells
  }
}      
我的目标是当UIButton deal3Card被按下时,gridCardView将在gridCardView上用更多的卡重新绘制自己

上面的代码通过编译器并显示按钮(deal3card)。但当我点击按钮时,它会出现异常:

2018-10-23 19:52:54.283032+0200网格测试[23636:5175258] -[gridTest.HeadStackView touchDeal3Card]:发送到实例0x7fb97180c8f0的选择器无法识别

2018-10-23 19:52:54.287469+0200网格测试[23636:5175258]*** 由于未捕获异常而终止应用程序 “NSInvalidArgumentException”,原因:”-[gridTest.HeadStackView touchDeal3Card]:发送到实例的无法识别的选择器 0x7fb97180c8f0'


撞车的直接原因如下:

deal3Card.addTarget(self, 
    action: #selector(ViewController.touchDeal3Card), for: .touchUpInside)
目标
self
错误。您希望将此消息发送到视图控制器,该控制器实现
touchDeal3Card
。但是在你的代码中,
self
是一个按钮,它没有

考虑到您构建的体系结构,最简单的解决方案是将
self
替换为
nil
。这将导致
touchDeal3Card
渗透到响应程序链并到达视图控制器


话虽如此,我认为架构本身是错误的。视图控制器应控制视图;观点不应该自我控制。创建按钮的应该是视图控制器,而不是视图。这一点可以从以下事实得到很好的说明:该代码完全错误:

override func draw(_ rect: CGRect) {
    setDeal3Card()
}

这完全是对
draw
的滥用,会给你带来可怕的麻烦。在
draw
中,您应该做的唯一一件事就是(等待)draw。在
draw
中添加子视图可能是错误的。

您一直在引用子视图,因此我想知道这些是否是一个主视图上的子视图,在这种情况下,它们是同一ViewController的子视图?是的。我在故事板上创建了两个视图。它们在同一个viewcontroller下,但每个都有自己的viewclass。你的代码毫无意义。无法区分变量名和类名。为什么要将SubView1子类化?@matt抱歉,我在这里写错了一些代码,已经更新。谢谢指点。非常感谢!!在我将self更改为ViewController()后,它现在可以工作了!不,那也错了。请把我的全部答案读几遍,或者大声读出来。
override func draw(_ rect: CGRect) {
    setDeal3Card()
}