2015-04-28 1 views
0

У меня есть четыре textField s, и каждый принимает только один символ, аналогичный экрану блокировки. Я могу ввести и перейти от одного textField к следующему textField.
Проблема в том, когда я хочу удалить и перейти к предыдущему textField, я не знаю, когда нажата кнопка удаления .Как узнать, когда нажата кнопка удаления на десятичной клавиатуре

Я использую:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool 

на вход и перейти от одного textField к другому.

Как узнать, когда нажата клавиша удаления?

ответ

2

Вслед за Иштван ответ, вы должны отправить уведомление, когда deleteBackward нажата:

class DigitField: UITextField { 
    override func deleteBackward() { 
     super.deleteBackward() 
     NSNotificationCenter.defaultCenter().postNotificationName("deletePressed", object: nil) 
    } 

} 

Тогда внутри viewDidLoad() добавить наблюдатель следующим образом:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "goPrevious", name: "deletePressed", object: nil) 

и ваш метод :

func goPrevious() { 
    if secondDigit.isFirstResponder() { 
     secondDigit.enabled = false 
     firstDigit.enabled = true 
     firstDigit.becomeFirstResponder() 
    } else if thirdDigit.isFirstResponder() { 
     thirdDigit.enabled = false 
     secondDigit.enabled = true 
     secondDigit.becomeFirstResponder() 
    } else if fourthDigit.isFirstResponder() { 
     fourthDigit.enabled = false 
     thirdDigit.enabled = true 
     thirdDigit.becomeFirstResponder() 
    } 
} 

Выберите текстовое поле и подключите его к своему DigitField

enter image description here

Вам необходимо подключить каждое текстовое поле IBAction (с использования отправлены событиями редактирования изменились)

enter image description here

мнения контроллера код должен выглядеть следующим образом:

import UIKit 

class ViewController: UIViewController { 

    @IBOutlet weak var firstDigit: UITextField! 
    @IBOutlet weak var secondDigit: UITextField! 
    @IBOutlet weak var thirdDigit: UITextField! 
    @IBOutlet weak var fourthDigit: UITextField! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     NSNotificationCenter.defaultCenter().addObserver(self, selector: "goPrevious", name: "deletePressed", object: nil) 

     firstDigit.secureTextEntry = true 
     secondDigit.secureTextEntry = true 
     thirdDigit.secureTextEntry = true 
     fourthDigit.secureTextEntry = true 

     firstDigit.keyboardType = .DecimalPad 
     secondDigit.keyboardType = .DecimalPad 
     thirdDigit.keyboardType = .DecimalPad 
     fourthDigit.keyboardType = .DecimalPad 

     firstDigit.becomeFirstResponder() 
     secondDigit.enabled = false 
     thirdDigit.enabled = false 
     fourthDigit.enabled = false 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func goPrevious() { 
     if secondDigit.isFirstResponder() { 
      secondDigit.enabled = false 
      firstDigit.enabled = true 
      firstDigit.becomeFirstResponder() 
     } else if thirdDigit.isFirstResponder() { 
      thirdDigit.enabled = false 
      secondDigit.enabled = true 
      secondDigit.becomeFirstResponder() 
     } else if fourthDigit.isFirstResponder() { 
      fourthDigit.enabled = false 
      thirdDigit.enabled = true 
      thirdDigit.becomeFirstResponder() 
     } 
    } 
    // You need to connect each text field to an IBAction (using sent events editing changed) – 
    @IBAction func firstChanged(sender: UITextField) { 
     if let digitOne = sender.text.toInt() { 
      println(digitOne) 
      sender.enabled = false 
      secondDigit.enabled = true 
      secondDigit.becomeFirstResponder() 
     } else { 
      sender.text = "" 
     } 
    } 

    @IBAction func secondChanged(sender: UITextField) { 
     if let digitTwo = sender.text.toInt() { 
      println(digitTwo) 
      sender.enabled = false 
      thirdDigit.enabled = true 

      thirdDigit.becomeFirstResponder() 
     } else { 
      sender.text = "" 
     } 
    } 

    @IBAction func thirdChanged(sender: UITextField) { 
     if let digitThree = sender.text.toInt() { 
      println(digitThree) 
      sender.enabled = false 
      fourthDigit.enabled = true 
      fourthDigit.becomeFirstResponder() 
     } else { 
      sender.text = "" 
     } 
    } 

    @IBAction func fourthChanged(sender: UITextField) { 
     if let digitFour = sender.text.toInt() { 
      println(digitFour) 
      sender.enabled = false 
     } else { 
      sender.text = "" 
     } 
    } 
} 
+0

https://www.dropbox.com/s/we6ag0teooluub1/fourDigitsInput.zip?dl=0 –

+0

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

+0

evrything работает, кроме удаления. показывает класс DigitField, вызываемый в контроллере представления? –

0

Существует вопрос о возможном решении in this answer. Вы можете унаследовать свой UITextField, а затем переопределить этот метод в подклассе:

(BOOL)keyboardInputShouldDelete:(UITextField *)textField 

событий этот код в Objective-C, он должен показать вам правильное использование этого метода.

0

Использование replacementString в функции знать, Что происходит в UITextField

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    if (string.length == 0) { 
     //delete 
    } else { 
     //any other key 
    } 

    return YES; 
} 
+0

был моим первым подходом, после первого ввода текста длина всегда одна. Пробовал также использовать строковое значение, но не смог обработать удаление. –

0

Я надеюсь, что мой ответ поможет вам:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 
    let char = string.cStringUsingEncoding(NSUTF8StringEncoding)! 
    let isBackSpace = strcmp(char, "\\b") 

    if (isBackSpace == -92) { 
     println("Backspace was pressed") 
    } 

    return true 
} 
2

Подкласс UITextField следующим образом:

import UIKit 

class MyTextField: UITextField { 
    override func deleteBackward() { 
     super.deleteBackward() 

     println("Delete button was tapped") 
    } 
} 

Тогда изменение класс вашего текстового поля в MyTextField. Это должно сделать это!

+0

'func textField (textField: MyTextField, shouldChangeCharactersInRange: NSRange, replacementString string: String) -> Bool'. ничего не получил, с вышеуказанным классом и методом. –

 Смежные вопросы

  • Нет связанных вопросов^_^