Swift:创build一个调用另一个class1中的方法的button

我有2个类,第一类被命名为“商店”,在那里我创build一个button,调用一个名为“ExploreViewControllers”的第二个类中的“storeSelected”方法。 该方法应打印“完成”,并带我到另一个视图控制器。 没有segue“完成”被打印,但是当把segue代码的应用程序崩溃。

错误是由于未捕获exception“NSInvalidArgumentException”而终止应用程序,原因:“Receiver()没有标识符”ok“的继续。

// ExploreViewController类

let _sharedMonitor: ExploreViewController = { ExploreViewController() }() class ExploreViewController: UIViewController, UIScrollViewDelegate{ class func sharedMonitor() -> ExploreViewController { return _sharedMonitor } func storeSelected(sender: UIButton) { println("done") // it entered here and "done" is printed self.performSegueWithIdentifier("ok", sender: self) //here is the problem } } 

//另一个名为“Store”的类

  //button is created let monitor = ExploreViewController.sharedMonitor() btn.addTarget(monitor, action: Selector("storeSelected:"), forControlEvents: UIControlEvents.TouchUpInside) 

假设你有一个视图控制器在你创buildStore对象的地方,你应该把button动作传回给这个视图控制器,并把它从它添加到你想要的目的地。

最佳做法是使用一个协议,将button操作委托给它所包含的viewController,如下所示。

Store.swift

 protocol StoreDelegate { func didPressButton(button:UIButton) } class Store: UIView { var delegate:StoreDelegate! override init(frame:CGRect) { super.init(frame:frame) var button = UIButton() button.setTitle("button", forState: .Normal) button.addTarget(self, action: "buttonPress:", forControlEvents: .TouchUpInside) self.addSubview(button) } func buttonPress(button:UIButton) { delegate.didPressButton(button) } } 

ViewController.swift

 class ViewController: UIViewController, StoreDelegate { override func viewDidLoad() { super.viewDidLoad() addStoreObj() } func addStoreObj() { var store = Store() store.delegate = self // IMPORTANT self.view.addSubview(store) } func didPressButton(button:UIButton) { self.performSegueWithIdentifier("ok", sender: nil) } } 

这段代码没有经过testing,但我希望你明白 – Store对象将button按下的活动委托给它的ViewController ,然后ViewController执行你在Storyboard中附加的button。