【问题标题】:Two targets for one button一键两个目标
【发布时间】:2017-03-03 00:44:35
【问题描述】:

我有一个自定义取消按钮,我也添加了两个目标。如果文本字段为空,则一个目标将起作用,但如果文本字段不为空,则另一个目标将起作用。但是两个目标同时对单个按钮起作用。有人可以帮助我并向我解释原因。

override func viewDidLoad() {
    super.viewDidLoad()
    FirstName.delegate = self
    LastName.delegate = self
    FirstName.addTarget(self, action:"edited", for:UIControlEvents.allEditingEvents)
    LastName.addTarget(self, action:"edited", for:UIControlEvents.allEditingEvents)
    // Do any additional setup after loading the view.
    if FirstName.text?.isEmpty == true || LastName.text == "" {
        ProgressButton.setImage(UIImage(named: "Skip"), for: .normal)
        ProgressButton.contentEdgeInsets = UIEdgeInsetsMake(0,0,0,0)
        ProgressButton.addTarget(self, action: #selector(Skip(_sender:)), for: UIControlEvents.touchUpInside)
    } else {
        ProgressButton.setImage(UIImage(named: "Right2"), for: .normal)
        ProgressButton.contentEdgeInsets = UIEdgeInsetsMake(20,31,24,0)
        ProgressButton.addTarget(self, action: #selector(Continue(_sender:)), for: UIControlEvents.touchUpInside)
    }
}

func edited() {
    if FirstName.text?.isEmpty == true || LastName.text == "" {
        ProgressButton.setImage(UIImage(named: "Skip"), for: .normal)
        ProgressButton.contentEdgeInsets = UIEdgeInsetsMake(0,0,0,0)
        ProgressButton.addTarget(self, action: #selector(Skip(_sender:)), for: UIControlEvents.touchUpInside)
    } else {
        ProgressButton.setImage(UIImage(named: "Right2"), for: .normal)
        ProgressButton.contentEdgeInsets = UIEdgeInsetsMake(20,31,24,0)
        ProgressButton.addTarget(self, action: #selector(Continue(_sender:)), for: UIControlEvents.touchUpInside)
    }
}

func Continue(_sender: ABProgressButton!) {
    FirstName.resignFirstResponder()
    LastName.resignFirstResponder()
        // Delay the dismissal by 5 seconds
        let delay = 0.85 * Double(NSEC_PER_SEC)
        var time = DispatchTime.now() + Double(Int64(delay)) / Double(NSEC_PER_SEC)
        DispatchQueue.main.asyncAfter(deadline: time, execute: {

            self.performSegue(withIdentifier: "ToViewController#2", sender: nil)

        })

}

func Skip(_sender: ABProgressButton!) {
    FirstName.resignFirstResponder()
    LastName.resignFirstResponder()
    self.performSegue(withIdentifier: "ToViewController#2", sender: nil)
}

【问题讨论】:

  • 在您遇到此行为时是否已调用 edited()?你如何确定这两种方法都被调用了?
  • 您不只是为您的按钮分配一个功能,当用户点击该按钮时,您的主功能会执行,它会检查布尔条件是否查看它应该调用的两个子功能中的哪一个和如果条件满足就调用它?
  • 你可能想看看这个总结的大小写约定等。github.com/raywenderlich/swift-style-guide 类、结构和枚举是大写的,而方法和变量是驼峰式的。

标签: ios swift


【解决方案1】:

您需要调用removeTarget(_:action:for:) 来执行您已在按钮上安装的操作。检查标题中的 cmets 是否有 addTarget(_:action:for:)

【讨论】:

    【解决方案2】:

    当视图生成时,第一个目标添加。 编辑文本时,添加第二个目标。 因此,当您编辑文本时,按钮有两个目标。 你需要在edited()中使用remove target

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多