Swift:创建一个调用另一个class1中的方法的按钮

Oma*_*ali 5 objective-c ios segue swift ios8

我有2个类,第一个类名为"store",我在其中创建一个调用方法的按钮:"storeSelected"位于第二个类中,名称为ExploreViewController.
该方法应该打印"完成"并带我到另一个视图控制器.如果没有segue,则会打印"done",但是当放置segue代码时,app会崩溃.

错误是:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Receiver (<Glam.ExploreViewController: 0x14ed3be20>) has no segue with identifier 'ok'' .........

// ExploreViewController Class

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                           
    }
}







// another class named "Store"  
// button is created

let monitor = ExploreViewController.sharedMonitor()
btn.addTarget(monitor, action: Selector("storeSelected:"), forControlEvents: UIControlEvents.TouchUpInside)
Run Code Online (Sandbox Code Playgroud)

Wez*_*Wez 23

假设您有一个创建Store对象的视图控制器- 您应该将按钮操作传递回此视图控制器并从中添加一个segue到您想要的目标.

最佳做法是使用一个协议,将按钮操作委托给它所包含的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)
    }

}
Run Code Online (Sandbox Code Playgroud)

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)
    }

}
Run Code Online (Sandbox Code Playgroud)

这段代码未经测试,但我希望你能得到这个想法 - 你的Store对象将按钮按下活动委托给它包含ViewController,然后ViewController执行你在Storyboard中附加到它的segue.

  • 太棒了,谢谢!,人们不会忘记:store.delegate = self (2认同)