UIButton внутри действия UISegmentedControl

#ios #swift #xcode #uibutton #uisegmentedcontrol

#iOS #swift #xcode #uibutton #uisegmentedcontrol

Вопрос:

Я продолжаю свою программу вычислений, чтобы улучшить свои навыки в Swift-коде. Прямо сейчас у меня проблема: я хочу, чтобы UISegmentedControl выбирал оператор моих операций ( , — ecc ..), и когда он выбран, функция UIButton вычисляет значения на основе решения 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;

    }

}



}
  

Ответ №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;

    }

}
  

Комментарии:

1. как и ожидалось, при нажатии кнопки ничего не происходит, потому что при нажатии кнопки не выполняется никаких действий. Я думаю, что @IBAction должен остаться. Кстати, большое вам спасибо за помощь… что еще мы можем сделать?

2. Можете ли вы установить точку останова в строке switch operatorSelector.selectedSegmentIndex { и посмотреть, выполняется ли она при изменении сегмента?

3. Вы говорите «выше» точки останова. Вы имеете в виду, что @IBAction ... становится зеленой или switch ... сама строка?

4. переключать строку при нажатии на «случай 1», в противном случае по умолчанию нет.

5. Хорошо, и что происходит, когда вы нажимаете на кнопку «перешагнуть» после того, как строка становится зеленой? кнопка перехода — это: 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")
        }
    }
}
  

Затем вы могли бы привязать это действие к отправленным событиям из вашего пользовательского интерфейса: например, к Editing Changed событию ваших текстовых полей (firstNumber и secondNumber) и Value Changed вашего сегментированного элемента управления (operatorSelector)

Я создал пример проекта, который иллюстрирует это:https://github.com/dev1an/calculator


Как привязать несколько событий к одному IBAction

Запишите IBAction в коде (как действие calculate, которое я написал выше). Перейдите к своей раскадровке и откройте вспомогательный редактор (AltCmdEnter). Выберите элемент пользовательского интерфейса (например, текстовое поле) в конструкторе интерфейса. Откройте инспектор подключений (AltCmd6) и перетащите из круга рядом с отправленным событием (например, изменение редактирования) в свой код IBAction.

Комментарии:

1. я не могу понять, как привязать. Похоже, у меня это не работает. Когда я подключаю circle, больше код не добавляется.

2. Это нормально, он не должен добавлять какой-либо код, поскольку код уже записан. «Подключение круга», как вы сказали, подключает событие к некоторому коду внутри вашей функции @IBAction (…) {…}. Когда пользователь теперь запускает событие, будет выполнен код, связанный с этим событием.