在Combine中点击publisher execute两次



我不想使用saveButton.addTarget(:selector:event),这就是为什么我尝试使用tap publisher fromCombineCocoa像这样的框架

saveButton.tapPublisher.sink {  _ in
print("tap") // tap twice
}
.store(in: &subscriptions)

,当我点击saveButton,然后'tap'打印两次。

我也尝试使用fromCombine框架
saveButton.publisher(for: .touchUpInside) 

,但有相同的结果。

我的代码在这里

class ArticleVC: UIViewController {
let saveButton: UIButton = {
let btn = UIButton()
btn.setTitle("Save", for: .normal)
return btn
}()

var subscriptions: Set<AnyCancellable> = []

override func viewDidLoad() {
super.viewDidLoad()

// add to view
view.addSubview(saveButton)
didTapSave()
saveButton.snp.makeConstraints {
$0.centerX.centerY.equalToSuperview()
}

didTapSave()
}

func didTapSave() {
//        saveButton.tapPublisher.sink(receiveValue: { _ in
//            print("tap")  // twice printed 'tap'
//        })
//        .store(in: &subscriptions)
/// OR
saveButton.publisher(for: .touchUpInside).sink { _ in
print("tap") // twice printed 'tap'
}
.store(in: &subscriptions)
}
}

原因是什么?

我猜您创建了两次管道。但是您没有展示在哪里创建管道,所以这只是一个猜测。(编辑:好吧,在我发布这个答案之后,你在问题中发布了你的代码,我的猜测显然是正确的,因为我们现在可以看到你创建了两次管道。]

为了支持这一点,我将展示我所做的:

  • 我创建了一个新的iOS项目。

  • 我在界面上放了一个按钮,并从我的ViewController钩住了一个出口。

  • 我安装了这个包https://github.com/CombineCommunity/CombineCocoa.git

  • 我配置了我的ViewController代码:

import UIKit
import Combine
import CombineCocoa
class ViewController: UIViewController {
@IBOutlet weak var button: UIButton!
var storage = Set<AnyCancellable>()
override func viewDidLoad() {
super.viewDidLoad()
button.tapPublisher
.sink { _ in print("tap") }
.store(in: &storage)
}
}

这就是所有的代码。我运行项目,点击按钮,看到"点击"一次。最后。

相关内容

  • 没有找到相关文章

最新更新