【问题标题】:Swift: Creating a button that calls a method in another classSwift:创建一个调用另一个类中的方法的按钮
【发布时间】:2015-04-10 10:57:22
【问题描述】:

我想在名为“store”的类中创建按钮,当单击它时,它会在另一个名为 ExploreViewController 的类中调用名为“storeSelected”的方法。

//class store
//create button
button.addTarget(ExploreViewController(), action: "storeSelected:", forControlEvents: UIControlEvents.TouchUpInside)


//class ExploreViewController


@IBAction func storeSelected(sender: UIButton) {

  self.performSegueWithIdentifier("pushProductDetail", sender: sender)
}

上面的代码在点击按钮的时候会报错,为什么?我该如何解决?

提前谢谢你。

【问题讨论】:

    标签: ios swift ios8


    【解决方案1】:

    您正在对ExploreViewController 的新实例执行操作,该实例将在调用该方法后立即被释放。将您的 ExploreViewController 存储在某处或使用现有实例。

    示例代码:

    Store 类,假设按钮已创建

    protocol storeDelegate {
        func storeSelected(sender:UIButton)
    }
    
    var delegate: storeDelegate // <-- conforms to the storeDelegate protocol
    
    // somewhere in viewDidLoad?
    button.addTarget(delegate, action: "storeSelected:", forControlEvents: UIControlEvents.TouchUpInside)
    

    ExploreViewController

    class ExploreViewController: storeDelegate {
        func storeSelected(sender: UIButton) {
          self.performSegueWithIdentifier("pushProductDetail", sender: sender)
        }
    
    // somewhere in here where you create the Store class:
        store.delegate = self
    }
    

    【讨论】:

    • @OmarKayali 我需要知道上下文:所以你有这个第一个 vc 呈现第二个 vc,但是按钮在哪里,你想在哪里调用一个方法?
    • 我有一个名为“exploreViewController”的 vc 类和另一个名为“store”的对象类,它创建按钮并具有 button.addtarget... 函数 storeSelected 在 vc 类中。跨度>
    • 您的store 类必须具有对exploreViewController 的引用。我建议你创建一个delegate 并让exploreViewController 符合协议。然后你可以简单地让委托执行delegate.pushProductDetail之类的方法。
    • 如果您能提供示例代码,我将不胜感激,这对我来说会更清楚。提前谢谢你
    • button.addTarget(delegate, action:"storeSelected:", forControlEvents: UIControlEvents.TouchUpInside) 这行代码给我一个错误,即“storeDelegate”与“AnyObject”不同。这个错误是什么意思,我该如何解决?提前谢谢你
    【解决方案2】:

    对于 Swift 2.2,感谢 @Schemetrical。

    protocol storeDelegate {
        func storeSelected(sender:UIButton)
    }
    var delegate: storeDelegate! // <-- conforms to the storeDelegate protocol
    
    // somewhere in viewDidLoad?
    button.addTarget(delegate as? AnyObject, action: "storeSelected:", forControlEvents: UIControlEvents.TouchUpInside)
    

    【讨论】:

      猜你喜欢
      • 2015-06-18
      • 2020-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多