Я разрабатываю простое приложение-калькулятор, чтобы понять, как работает разработка OSX (это не домашнее задание). Когда addAction(_ sender: NSButton)
запускается, он добавляет currentCount
и amountToAdd
вместе, затем обновляет currentCount
и устанавливает его в currentCountLabel
.
Проблема: при первом запуске приложения currentCount
и amountToAdd
установлены на 0, но при суммировании получается 4 300 282 608. Если я нажму кнопку очистки перед добавлением, она будет равна 0, что правильно.
Вопрос: Как я могу изменить код, чтобы сделать правильный расчет с первого раза. Похоже, проблема с кастингом.
import Cocoa
class ContainerViewController: NSViewController {
var currentCount: Int = 0
var amountToAdd: Int = 0
@IBOutlet weak var currentCountLabel: NSTextField!
@IBOutlet weak var amountToAddTextField: NSTextField!
override func viewDidLoad() {
super.viewDidLoad()
currentCountLabel.integerValue = 0
amountToAddTextField.integerValue = 0
}
@IBAction func amountTextField(_ sender: NSTextField) {
amountToAdd = amountToAddTextField.integerValue
}
@IBAction func addAction(_ sender: NSButton) {
currentCount = currentCount + amountToAdd
currentCountLabel.integerValue = currentCount
}
@IBAction func clearAction(_ sender: Any) {
currentCount = 0
amountToAdd = 0
currentCountLabel.integerValue = 0
amountToAddTextField.integerValue = 0
}
func getEntryLog() -> String {
return "\(currentCount) + \(amountToAdd) = \(currentCount + amountToAdd)"
}
}
При загрузке изображения текущий счет становится случайным числом при каждом запуске...
Я предлагаю вам добавить точку останова в addAction
и подтвердить, какое из этих двух значений неверно. На основании того, чем вы с нами поделились, предположительно currentCount
не то, что вы думаете.
Единственное незначительное логическое расхождение, которое я вижу здесь, заключается в том, что в viewDidLoad
вы предполагаете, что amountToAdd
и currentCount
оба являются 0
, хотя технически возможно, что тот, кто представил этот контроллер представления, мог сбросить одно из этих значений (возможно, неправильно) между моментом, когда контроллер представления был создан и когда он был загружен.
Чтобы устранить это логическое отключение, вы можете явно использовать эти переменные, а не 0:
override func viewDidLoad() {
super.viewDidLoad()
currentCountLabel.integerValue = currentCount
amountToAddTextField.integerValue = amountToAdd
}
Или, если вы хотите, чтобы загрузка контроллера представления сбрасывала представление, тогда и viewDidLoad
, и clearAction
вызывают некоторую общую процедуру:
override func viewDidLoad() {
super.viewDidLoad()
resetValues()
}
@IBAction func clearAction(_ sender: Any) {
resetValues()
}
private func resetValues() {
currentCount = 0
amountToAdd = 0
currentCountLabel.integerValue = 0
amountToAddTextField.integerValue = 0
}
Если у вас есть какой-то другой код, представляющий этот контроллер представления, я бы посоветовал вам проверить его на наличие всего, что могло установить (возможно, неправильно) currentCount
.
Или поставьте точку останова в viewDidLoad
и добавьте часы на значение, которое, по вашему мнению, не должно быть. Например. Я control-щелкнул currentCount
в представлении переменных и выбрал «Смотреть currentCount», и теперь он будет останавливаться каждый раз, когда это значение изменяется.
Приносим извинения за то, что не ответили раньше. Я преследовал проблему с помощью отладчика, и оказалось, что после инициализации @IBOutlet weak var amountToAddTextField: NSTextField!
amountToAdd
изменяется. Он перешел к тому, что казалось машинным кодом, но я не смог увидеть изменение значения за это время. Очень странное поведение... Если я позвоню reset()
, он будет работать, как и ожидалось. Спасибо за помощь!
Я не могу воспроизвести ту же проблему, используя точно такой же код, как у вас. Вы сделали какие-то специальные настройки для вашей раскадровки? Пожалуйста, попробуйте создать новый проект и посмотрите, сможете ли вы воспроизвести проблему.