【问题标题】:UIButton inside UISegmentedControl actionUISegmentedControl 动作中的 UIButton
【发布时间】:2016-10-19 14:21:53
【问题描述】:

我正在继续我的计算程序,以提高我的 Swift 代码技能。 Right now I have a problem: I want that an UISegmentedControl select the operator of my operations (+, - ecc..) and when one is selected a UIButton func calculate the values based on the decision of the UISegmentedControl.

这是代码,但不起作用。

谢谢, 马特奥

import UIKit

class ViewController: UIViewController {


@IBOutlet weak var firstNumber: UITextField!
@IBOutlet weak var secondNumber: UITextField!
@IBOutlet weak var resultButton: UIButton!
@IBOutlet weak var resultNumber: UILabel!
@IBOutlet weak var operatorSelector: UISegmentedControl!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.


}

override func didReceiveMemoryWarning() {

    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


@IBAction func operatorSelectorChanged(_ sender: UISegmentedControl) {
    switch operatorSelector.selectedSegmentIndex {
    case 0:
        @IBAction func resultFunction(_ sender: AnyObject) {
            if let firstNumberConv :Int = Int(firstNumber.text!), let secondNumberConv :Int = Int(secondNumber.text!) {
                let result = firstNumberConv + secondNumberConv
                resultNumber.text = "\(result)"
            } else { resultNumber.text = "Inserire solo valori numerici"}
        }


    case 1:
        @IBAction func resultFunction(_ sender: AnyObject) {
            if let firstNumberConv :Int = Int(firstNumber.text!), let secondNumberConv :Int = Int(secondNumber.text!) {
                let result = firstNumberConv - secondNumberConv
                resultNumber.text = "\(result)"
            } else { resultNumber.text = "Inserire solo valori numerici"}
        }

    default:
        break;

    }

}



}

【问题讨论】:

    标签: ios swift xcode uibutton uisegmentedcontrol


    【解决方案1】:

    尝试删除开关盒中带有@IBAction func ... 的行。

    我认为你的@IBAction func operatorSelectorChanged 应该是这样的:

    @IBAction func operatorSelectorChanged(_ sender: UISegmentedControl) {
        switch operatorSelector.selectedSegmentIndex {
        case 0:
            if let firstNumberConv = Int(firstNumber.text!), let secondNumberConv = Int(secondNumber.text!) {
                let result = firstNumberConv + secondNumberConv
                resultNumber.text = "\(result)"
            } else { resultNumber.text = "Inserire solo valori numerici"}
    
    
        case 1:
            if let firstNumberConv = Int(firstNumber.text!), let secondNumberConv = Int(secondNumber.text!) {
                let result = firstNumberConv - secondNumberConv
                resultNumber.text = "\(result)"
            } else { resultNumber.text = "Inserire solo valori numerici"}
    
        default:
            break;
    
        }
    
    }
    

    【讨论】:

    • 正如预期的那样,单击按钮时没有任何反应,因为按下按钮时没有执行任何操作。我认为@IBAction 必须保留。顺便说一句,非常感谢您的帮助...我们还能做些什么?
    • 能否在switch operatorSelector.selectedSegmentIndex {这一行设置一个断点,看看当你改变段时它是否被执行?
    • 你说的“高于”断点。你的意思是@IBAction ... 变成绿色还是switch ... 线本身?
    • 点击“case 1”时切换行,否则默认没有。
    • 好的,当你在线条变绿后点击“越过”按钮时,会发生什么?跳过按钮是:i.stack.imgur.com/b4Mbc.png
    【解决方案2】:

    您的问题的一个可能解决方案是定义一个 IBAction 来计算两个数字相加/相减的结果

    @IBAction func calculate(_ sender: AnyObject) {
        if let a = Int(firstNumber.text!), let b = IntsecondNumber.text!) {
            switch operatorSelector.selectedSegmentIndex {
            case 0:
                resultNumber.text = "\(a+b)"
            case 1:
                resultNumber.text = "\(a-b)"
            default:
                print("❗️unknown operator selected")
            }
        }
    }
    

    然后您可以将此操作绑定到从您的用户界面发送的事件:例如,您的文本字段(firstNumber 和 secondNumber)的Editing Changed 事件和您的分段控件(operatorSelector)的Value Changed

    我创建了一个示例项目来说明这一点:https://github.com/dev1an/calculator


    如何将多个事件绑定到一个 IBAction

    在代码中写下 IBAction(就像我上面写的计算操作)。转到您的故事板并打开辅助编辑器(AltCmdEnter)。在界面构建器中选择一个 UI 元素(如文本字段)。打开 Connections Inspector (AltCmd6) 并从已发送事件(例如 Editing Changed)旁边的圆圈拖动到您的 IBAction 代码.

    【讨论】:

    • 我无法理解如何绑定。看起来它不适合我。当我连接圆圈时,不再添加代码。
    • 没关系,它不应该添加任何代码,因为代码已经写下来了。就像你说的,“连接圆圈”是将事件连接到你的@IBAction func(...) {...} 中的一些代码。当用户现在触发事件时,将执行连接到该事件的代码。
    猜你喜欢
    • 2011-02-11
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    相关资源
    最近更新 更多