#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 (…) {…}. Когда пользователь теперь запускает событие, будет выполнен код, связанный с этим событием.