Как получить текст текстового поля изнутри функции?

Я хочу создать приложение с 2 текстовыми полями, 4 кнопками и текстовым представлением. 1, которая очищает содержимое первого текстового поля, и еще одна кнопка, которая вводит текущее время, округленное до ближайших 4, и текстовое представление для отображения общего времени в минутах. То же самое с другим текстовым полем. Это приложение для расчета общего времени, потраченного на что-либо, в минутах.

макет приложения

Я также хочу ограничить количество возможных вставляемых символов до 5, поскольку время имеет максимум 5 символов, как в «15:00». Мне удалось создать наблюдаемый объект:

class TextFieldManager: ObservableObject {

    let characterLimit = 5

    @Published var userInput = "" {
        didSet {
            // Limit the max length of the field
            if userInput.count > characterLimit {
                userInput = String(userInput.prefix(characterLimit))
            } else if userInput.count >= 4 {
                // call the setTotalTime func or something to set totalTime
            }
        }
    }
}

что действительно хорошо работает.

Я также могу очистить текстовое поле и установить текущее время, округленное до ближайшего 5, но я не могу ограничить количество символов до 5 И заставить кнопки делать что-то одновременно.

Так что прямо сейчас он может: - Ограничить количество символов до 5

ИЛИ возможность:

  • очистить текстовое поле с помощью кнопки
  • время ввода теперь округляется до ближайшего 5 в текстовое поле с помощью кнопки.

Если я использую метод наблюдаемого объекта, когда он находится над блоком тела моего ContentView:

@ObservedObject var startTimeManager = TextFieldManager()
@ObservedObject var endTimeManager = TextFieldManager()

и это внутри тела для текстовых полей:

TextField("hh:mm", text: $startTimeManager.userInput)
TextField("hh:mm", text: $endTimeManager.userInput)

и класс TextFieldManager, как показано выше, чем теперь я больше не знаю, как получить значение текстового поля.

Если внутри ввода кнопка текущего времени, я пытаюсь установить время, выполнив

$startTimeManager.userInput = "whatever the current time is"

я получаю сообщение об ошибке, что я не могу изменить значение типа binding<String> что-то. Точно так же я также не могу очистить текстовое поле таким же образом.

Также я хотел бы вызвать функцию внутри этой части:

} else if userInput.count >= characterLimit {
    // call the setTotalTime func or something to set totalTime
}

У меня есть файл Functions.swift, в котором есть как класс TextFieldManager, так и моя функция, которую я хочу вызвать, но если я попытаюсь вызвать функцию здесь, он говорит, что функция не существует? И внутри функции я снова хотел бы иметь доступ к значениям текстовых полей во время вызова, но я не знаю, как читать значения текстовых полей изнутри функции.

Я надеюсь, что у меня есть смысл, и что кто-то сможет мне помочь или указать правильное направление. Я сделал то же приложение для android (студия android), windows (python3) и Mac (python3), но эта штука с iphone и Xcode действительно не хочет работать. Я просмотрел кучу обучающих видео и руководств, но ни один из них не пытается делать то, что я пытаюсь сделать. Как я уже сказал, я могу заставить работать оба, но никогда вместе, и в обоих случаях я не могу каким-то образом получить доступ к значениям текстового поля внутри функции. Я чувствую, что должен быть так близко, но что-то не складывается у меня в голове.

Также, пока я нахожусь в этом, в Python 3, чтобы поймать все ошибки и позволить им проходить беззвучно, я могу сделать:

Try:
    break_my_stuff = int("Break my stuff)"
    ignore_some_more_stuff = int("ignore some more stuff)"
    etc.
    etc.
except Exception:
    # catch silently and do nothing
    pass

Есть ли что-то подобное в swift, потому что

do {
    breakMyStuff = whatever might make something break in swift
    ignoreSomeMoreStuff = whatever might make something break in swift
    etc.
    etc.
} catch {
    // do nothing and pass silently
}

не работает, потому что нужно что-то попробовать, а я не смог опробовать весь раздел, как на Python.


person Sea Wolf    schedule 19.06.2020    source источник


Ответы (1)


Если внутри ввода кнопка текущего времени, я пытаюсь установить время, выполнив

$ startTimeManager.userInput = независимо от текущего времени

в этом случае привязка не требуется, просто присвойте свойство обычным способом

self.startTimeManager.userInput = "whatever the current time is"
person Asperi    schedule 19.06.2020
comment
Если это действительно так просто, и если это сработает, это будет потрясающе! Я не могу попробовать до понедельника :( Любая идея, как я могу получить доступ к тому же экземпляру startTimeManager, который я использую здесь: @ObservedObject var startTimeManager = TextFieldManager (), без функции? Или я могу просто ввести этот точный код внутри моей функции, и он обновит мое текстовое представление, если я помещу то, что вы предлагаете, внутри функции? Также есть идеи, если я программно изменю текст текстового поля, если он вызовет наблюдаемый объект? - person Sea Wolf; 20.06.2020