Swift: 创建一个调用另一个类中的方法的按钮1
Swift: Creating a button that calls a method in another class1
我有 2 个 class,第一个 class 被命名为 "store",我在其中创建了一个调用方法的按钮:"storeSelected" 位于名称为 ExploreViewController
的第二个 class 中。
该方法应该打印 "done" 并将我带到另一个视图控制器。
没有 segue "done" 被打印但是当输入 segue 代码时应用程序崩溃。
错误是:
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)
假设您有一个视图控制器,您可以在其中创建 Store
对象 - 您应该将按钮操作传递回该视图控制器,并从中添加一个 segue 到您想要的目的地。
最佳做法是使用一种协议,将按钮操作委托回 viewController,如下所示。
Store.swift
protocol StoreDelegate: NSObject {
func didPressButton(button:UIButton)
}
class Store: UIView {
weak 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)
}
}
此代码未经测试,但我希望您能理解 - 您的 Store
对象将按钮按下 activity 委托回其包含的 ViewController
然后 ViewController 执行您在 Storyboard 中附加到它的 segue。
我有 2 个 class,第一个 class 被命名为 "store",我在其中创建了一个调用方法的按钮:"storeSelected" 位于名称为 ExploreViewController
的第二个 class 中。
该方法应该打印 "done" 并将我带到另一个视图控制器。
没有 segue "done" 被打印但是当输入 segue 代码时应用程序崩溃。
错误是:
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)
假设您有一个视图控制器,您可以在其中创建 Store
对象 - 您应该将按钮操作传递回该视图控制器,并从中添加一个 segue 到您想要的目的地。
最佳做法是使用一种协议,将按钮操作委托回 viewController,如下所示。
Store.swift
protocol StoreDelegate: NSObject {
func didPressButton(button:UIButton)
}
class Store: UIView {
weak 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)
}
}
此代码未经测试,但我希望您能理解 - 您的 Store
对象将按钮按下 activity 委托回其包含的 ViewController
然后 ViewController 执行您在 Storyboard 中附加到它的 segue。