Как отменить изменения UITextField в Swift - PullRequest
1 голос
/ 01 февраля 2020

Я уверен, что есть простой ответ на этот вопрос, но я довольно новичок в программировании и много раз искал здесь и в нескольких учебных пособиях по отмене, которые я смог найти.

У меня есть две кнопки и UITextField с номером в нем. Кнопки увеличивают число в текстовом поле вверх или вниз на 1 соответственно. У меня есть еще несколько наборов этих двух кнопок и текстовое поле, каждое из которых представляет что-то свое. Затем у меня есть кнопки отмены и повтора, которые отменяют изменения в текстовых полях, вызванные нажатием кнопок. Все это прекрасно работает.

Так что теперь я пытаюсь добавить возможность отмены изменений от редактирования текстового поля непосредственно с помощью цифровой клавиатуры, чтобы оно попадало в тот же стек отмены, а затем его можно было отменить и повторить. из тех же кнопок отмены и повтора.

Вот фрагмент кода, который управляет отменой и возвратом нажатий кнопок. Затем, как я уже сказал, у меня есть еще несколько наборов, которые все go в том же стеке отмены. Спасибо.

UITextField

@IBOutlet weak var Money: UITextField!

Кнопки отмены и повтора

@IBAction func Undo(_ sender: UIButton)
{
    undoManager?.undo()
}
@IBAction func Redo(_ sender: UIButton)
{
    undoManager?.redo()
}

Кнопки вверх и вниз один

@IBAction func MonDown(_ sender: UIButton)
{
    subtractOneMon(Mon: Money)
}

@IBAction func MonUp(_ sender: UIButton)
{  
    addOneMon(Mon: Money)
}

Функции Регистрация отмены / Повтора

func subtractOneMon(Mon: UITextField)
{
    undoManager?.registerUndo(withTarget: self, handler:
    {(targetSelf) in
        targetSelf.addOneMon(Mon: self.Money)
    })

    let Mon = Double(Money.text!)
    let NewMon = Double(Mon! - 1)
    Money.text = Int(NewMon).description
}
func addOneMon(Mon: UITextField)
{
    undoManager?.registerUndo(withTarget: self, handler:
    {(targetSelf) in
        targetSelf.subtractOneMon(Mon: self.Money)
    })

    let Mon = Double(Money.text!) ?? 0
    let NewMon = Double(Mon + 1)
    Money.text = Int(NewMon).description
}

1 Ответ

0 голосов
/ 02 февраля 2020

Возможно, вы захотите добавить IBAction «Редактирование изменено» для вашего текстового поля. Эта функция будет вызываться каждый раз, когда изменяется любое содержимое поля.

Вы хотите где-то сохранить предыдущее значение текстового поля. Внутри IBAction «Редактирование изменено» вы регистрируете операцию отмены в вашем undoManager, используя предыдущее значение, а затем обновляете предыдущее значение текущим значением.

PS В способах обработки ваших обработчиков существует потенциальная утечка памяти. реализовано: в настоящее время они держат сильную ссылку на ваш UIViewController. Попробуйте добавить [слабое я] в список захвата. Чтобы узнать больше, прочитайте статью об управлении памятью .

...