将自定义参数传递给uibutton #selector swift 3

时间:2017-01-25 08:39:51

标签: swift uibutton swift3

我有两个课程,我将uistackviews从一个班级传递给另一个班级。我希望控件在同一个stackview中创建。因此,我在所有渲染函数参数中传递视图。我还希望通过#selector

的操作uibutton传递该视图

第1课:

class ViewController: UIViewController {    
  func createbutton(parentview: UIStackView) {
    let buttn = UIButton()
    buttn.backgroundColor = .gray
    buttn.setTitle("testttt", for: .normal)
    buttn.frame.size.height = 30
    buttn.frame.size.width = 40
    buttn.addTarget(self, action: #selector(anotherbutton(parentview:)), for: .touchUpInside)
    parentview.addArrangedSubview(buttn)
  } 

  func anotherbutton(parentview: UIStackView) {
    //another button here
  }    

  func loadpage() {
    print("loadpage")
  }
}

第2课:

class plugin : UIViewController {       

let vw = ViewController()

override func viewDidLoad() {
    super.viewDidLoad()
    let parentview = getparentnode()
    vw.createbutton(parentview: parentview)
}

func getparentnode() -> UIStackView {
    let parentnode =  UIStackView()
    parentnode.axis  = UILayoutConstraintAxis.vertical
    parentnode.distribution  = UIStackViewDistribution.equalSpacing
    parentnode.alignment = UIStackViewAlignment.center
    parentnode.spacing   = 16.0
    parentnode.tag = 50
    parentnode.translatesAutoresizingMaskIntoConstraints = false;

    self.view.addSubview(parentnode)
    //Constraints
    parentnode.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true
    parentnode.centerYAnchor.constraint(equalTo: self.view.centerYAnchor).isActive = true
    return parentnode
}
}

但这会引发错误unrecognized selector sent to instance 0x7b25e010'

如何在动作选择器参数中传递UIView?感谢您的帮助

1 个答案:

答案 0 :(得分:2)

你做不到。您可以通过选择器的唯一事项是:

  1. 没有
  2. 对象本身(在本例中为按钮)
  3. 这些情况如下所示:

    button.addTarget(self, action: #selector(myFunc), ...) //no parameters
    

    button.addTarget(self, action: #selector(myFunc(_:)) //passes itself (the button)
    

    如果要将视图的值传递给另一个ViewController,我建议使用prepareForSegue方法。这就是你应该如何将数据从ViewController传递给ViewController。

    就你的其余代码而言,我相信你是通过在另一个类中创建一个类的实例来打破MVC设计模式(这一行:let vw = ViewController())。首先,如果你的ViewController与你设备上运行的ViewController不同,这将创建一个全新的实例。其次,这是不好的做法。您应该允许每个viewController管理自己,而不是从其他viewControllers向外干扰。使用prepareForSegue是有效使用MVC设计模式的一个示例。

    希望这会有所帮助。