Виявити задню область в порожньому полі UITextField


126

Чи є спосіб визначити , коли Backspace/ Deleteнатиснута клавіша на клавіатурі iPhone на UITextFieldщо порожньо? Я хочу знати, коли Backspaceнатискається лише, якщо значення UITextFieldпорожнє.


На основі пропозиції від @Alex Reynolds у коментарі я додав такий код під час створення мого текстового поля:

[[NSNotificationCenter defaultCenter] addObserver:self
          selector:@selector(handleTextFieldChanged:)
              name:UITextFieldTextDidChangeNotification
            object:searchTextField];

Це повідомлення отримується ( handleTextFieldChangedфункція викликається), але все ж не, коли я натискаю Backspaceклавішу в порожньому полі. Будь-які ідеї?


Здається, існує певна плутанина навколо цього питання. Я хочу отримати сповіщення при Backspaceнатисканні клавіші. Це воно. Але рішення також має працювати, коли UITextFieldвже пусте.


Я думаю, ви можете мати на увазі «лише якщо поле UITextField порожнє», а не «лише якщо клавіатура порожня» ...?
Стів Харрісон

@Steve Harrison: спасибі. Оновлено це.
marcc

Я намагаюся зробити щось подібне, яке рішення ти отримав тоді? Те, що я роблю, - це текстове поле у ​​вікні прокрутки, коли я набираю текст, пропозиції відображаються, а коли натискаю на нього, об’єкт мітки розміщується зліва від текстового поля. Дякую заздалегідь: D
Тісто

2011/11 рішення для порожнього UITextField за допомогою хитрості виконання: bjhomer.blogspot.com/2011/11/…
Jano

4
Смішно довго прагнуть чогось такого тривіального. Це не повинно бути складно.
Адам Вейт

Відповіді:


36

Це може бути дальність пострілу, але це може спрацювати. Спробуйте встановити текст текстового поля символом нульової ширини \u200B. Якщо натиснути на зворотній простір текстове поле, яке видається порожнім, воно фактично видалить ваш простір. Тоді можна просто вставити простір.

Може не працювати, якщо користувачеві вдасться перемістити каре ліворуч від місця.


3
@Andrew, такий підхід я вирішив взяти. Знадобилося трохи коду, але це, безумовно, ефективно. Дякую за допомогу, а не намагаєтесь сказати мені, що я щось роблю не так.
marcc

2
Ця методика може працювати на iPhone> 3.1.3, але вона хитра і може зламатися на майбутніх версіях і т. Д. Я думаю, що я знайшов більш чисте, стабільне рішення, як виявити натиснення клавіші видалення на клавіатурі iPhone / iOS .
ma11hew28

6
Я можу підтвердити, що видалення не виявлено, якщо користувачеві вдалося перемістити курсор ліворуч від місця. Якщо ви можете з'ясувати , як виправити це, то ви повинні також підклас UITextFieldі реалізувати canPerformAction:withSender:в return NOпротягом select:і selectAll:дій , якщо текст дорівнює рядку @"\u200B".
ma11hew28

2
Проблема полягає в тому, що це не працює для безпечних тестових полів. Будь-які ідеї, як з цим впоратися?
Кайл Клегг

7
Вибачте, але ця думка погана. Це неймовірно хакі, і це не повинно бути прийнятою відповіддю з 30 або більше заявок. Я б замість цього підкласив UITextField, як і деякі інші коментатори.
Брайан Сачетта

155

Швидкий 4:


Підклас UITextField:

// MyTextField.swift
import UIKit

protocol MyTextFieldDelegate: AnyObject {
    func textFieldDidDelete()
}

class MyTextField: UITextField {

    weak var myDelegate: MyTextFieldDelegate?

    override func deleteBackward() {
        super.deleteBackward()
        myDelegate?.textFieldDidDelete()
    }

}

Впровадження:

// ViewController.swift

import UIKit

class ViewController: UIViewController, MyTextFieldDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        // initialize textField
        let input = MyTextField(frame: CGRect(x: 50, y: 50, width: 150, height: 40))

        // set viewController as "myDelegate"
        input.myDelegate = self

        // add textField to view
        view.addSubview(input)

        // focus the text field
        input.becomeFirstResponder()
    }

    func textFieldDidDelete() {
        print("delete")
    }

}

Завдання-C:


Підклас UITextField:

//Header
//MyTextField.h

//create delegate protocol
@protocol MyTextFieldDelegate <NSObject>
@optional
- (void)textFieldDidDelete;
@end

@interface MyTextField : UITextField<UIKeyInput>

//create "myDelegate"
@property (nonatomic, assign) id<MyTextFieldDelegate> myDelegate;
@end

//Implementation
#import "MyTextField.h"

@implementation MyTextField

- (void)deleteBackward {
    [super deleteBackward];

    if ([_myDelegate respondsToSelector:@selector(textFieldDidDelete)]){
        [_myDelegate textFieldDidDelete];
    }
}

@end

Тепер просто додайте MyTextFieldDelegate до свого UIViewControllerта встановіть UITextFields myDelegate на self:

//View Controller Header
#import "MyTextField.h"

//add "MyTextFieldDelegate" to you view controller
@interface ViewController : UIViewController <MyTextFieldDelegate>
@end

//View Controller Implementation
- (void)viewDidLoad {
    //initialize your text field
    MyTextField *input = 
     [[MyTextField alloc] initWithFrame:CGRectMake(0, 0, 70, 30)];

    //set your view controller as "myDelegate"
    input.myDelegate = self;

    //add your text field to the view
    [self.view addSubview:input];
}

//MyTextField Delegate
- (void)textFieldDidDelete {
    NSLog(@"delete");
}

9
Це найкраще рішення. Відповідь прийнята - хак. Завдання C засноване на підкласифікації, і це рішення використовує його належним чином для вирішення проблеми.
TJ

Що буде з моїми існуючими методами делегата в ViewController класі, якщо я встановлю делегата мого текстового поля на підклас UITextFieldзамістьUIViewController
rohan-patel

4
Це, мабуть, не працює в ios8 зараз, через те, що здається Apple Bug: devforums.apple.com/message/1045312#1045312
chug2k

1
Я використовував рішення для вирішення помилки ios8, як у своїй відповіді, і воно спрацювало. Це може бути корисно тим, хто шукає рішення.
furkan3ayraktar

1
deleteBackward()не викликатиме , якщо вам return falseвtextField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
igrrik

41

Оновлення: див . Відповідь Якоба Карабалло для прикладу, який переосмислюється -[UITextField deleteBackward].

Перевірте UITextInput, спеціально UIKeyInputіснує deleteBackwardметод делегата, який завжди викликається при натисканні клавіші видалення. Якщо ви робите щось просте, то ви можете розглянути лише підкласифікацію UILabelі зробити її відповідно до UIKeyInputпротоколу, як це робиться SimpleTextInput та цим прикладом iPhone UIKeyInput . Примітка. UITextInputЇї родичі (у тому числі UIKeyInput) доступні лише в iOS 3.2 та новіших версіях.


2
Це правильна відповідь. Це не хакі і дуже простий з швидким підкласом UITextField.
Сем

Щойно помітив відповідь Якова нижче. Це дає детальний приклад цього.
Сем

Варто зазначити, що ця відповідь не працює в iOS 5. Якщо текстове поле порожнє, натискання зворотної області не викликає цей метод.
jfeldman

31

Код, як:

@interface MyTextField : UITextField
@end

@implementation MyTextField

- (void)deleteBackward
{
    [super deleteBackward];

    //At here, you can handle backspace key pressed event even the text field is empty
}

@end

Нарешті, не забудьте змінити властивість власного класу з текстового поля на "MyTextField"


5
Це має бути прийнятою відповіддю. Очистіть і насправді відповідає на питання.
Райан Романчук

1
Це відповідає на питання ... Поки ви орієнтуєтесь на iOS 6.0+. На iOS 5, на жаль, deleteBackward просто ніколи не закликався до вашого підкласу.
BJ Гомер

2
BJ Homer, 93% пристроїв перебувають на iOS 6, тому не орієнтуватися на iOS 5, як правило, не така вже й велика справа.
Джонатан.

2
Я радий, що я прокручував достатньо, щоб знайти це. На 100% правильний спосіб зробити це сьогодні в IOS 7.
MusiGenesis

Я бачив так багато інших відповідей на це питання, які є лише обхідними шляхами, і навряд чи хтось із них має справу з ситуацією, коли клавішу зворотного простору натискають у порожньому полі. Однак це ідеально, і це дійсно чистий спосіб зробити це.
Крістофер Ханна

19

Швидка реалізація:

import UIKit

protocol PinTexFieldDelegate : UITextFieldDelegate {
    func didPressBackspace(textField : PinTextField)
}

class PinTextField: UITextField {

    override func deleteBackward() {
        super.deleteBackward()

        // If conforming to our extension protocol
        if let pinDelegate = self.delegate as? PinTexFieldDelegate {
            pinDelegate.didPressBackspace(self)
        }
    }
}

Дякую, чи можу я знати, що цей спосіб рекомендується яблуком або це злом. це здається недокументованим для текстового поля.
калпеш джетані

Працював для мене з textView. дякую за обмін;)
Едуард Барб'є

Працював для мене, коли текстове поле порожнє і натискається простір назад.
Рамакришна

17

Я створив інший спосіб простіше, ніж subclassрішення. Навіть його трохи дивно, але це працює нормально.

- (BOOL)textView:(UITextView *)textView 
        shouldChangeTextInRange:(NSRange)range 
        replacementText:(NSString *)text
{
    const char * _char = [text cStringUsingEncoding:NSUTF8StringEncoding];
    int isBackSpace = strcmp(_char, "\b");

    if (isBackSpace == -8) {
       // is backspace
    }

    return YES;
}

Це трохи дивно, якщо результат порівняння -8. Можливо, я помиляюся в якійсь точці C Programming. Але його правильна робота;)


1
Назад не встановлено "\ b". Але якщо ви ретельно налагодите, то ви побачите "\ 0". Тому я отримую результат 0, тобто два значення рівні методом strcmp. const char * stoke = [текст cStringUsingEncoding: NSASCIIStringEncoding]; const char * backstroke = "\ 0"; // це дорівнює \ b -> "\ x08"; strcmp (backstroke, stoke);
Йон Лі

Також за визначенням strcmp (s1, s2) повертає 0, якщо s1 == s2,> 0 s1 має лексикографічно більше, ніж s2 навпаки.
Yoon Lee

Я не розумію, як це могло працювати? @YoonLee: ти не кажеш, що і strcmpповернення -1, 0, or 1? Це було моє розуміння.
chug2k

1
у текстовому перегляді ви завжди виявляєте зворотний простір, навіть якщо немає тексту, поле UITextField інше
LolaRun

2
Це UITextViewDelegateметод, а не UITextFieldDelegate.
pkamb

11

Спробуйте delegate

- (BOOL)textField:(UITextField *)textField 
        shouldChangeCharactersInRange:(NSRange)range 
        replacementString:(NSString *)string {

Потім перевірте, чи не range.length == 1здається, що трапляється при backspaceпопаданні.


8
Хоча називається лише тоді, коли поле не порожнє. Зверніть увагу на оригінальне запитання. :)
Ерік Голдберг

Використовуйте для цього UITextView.
Олег

11

будь ласка, використовуйте код нижче, він допоможе вам виявити клавішу видалення клавіатури, навіть якщо текстове поле порожнє.

Мета C:

- (BOOL)keyboardInputShouldDelete:(UITextField *)textField { return YES; }

Швидкий:

func keyboardInputShouldDelete(_ textField: UITextField) -> Bool { return true }

Тх - саме те, що мені було потрібно. Але де це задокументовано ??
Енді Вайнштейн

9

Відповідь Нікласа Альвея допомогла мені вирішити подібне питання

Я обмежував доступ до певного набору символів, але ігнорував зворотні простори. Тож я перевірив її range.length == 1перед обрізкою NSString. Якщо це правда, я просто повертаю рядок і не обрізаю її. Дивись нижче

 - (BOOL) textField:(UITextField *)textField 
          shouldChangeCharactersInRange:(NSRange)range 
          replacementString:(NSString *)string
 {
     NSCharacterSet *nonNumberSet = 
      [[NSCharacterSet characterSetWithCharactersInString:@"0123456789."] 
         invertedSet];

    if (range.length == 1) {
       return string;
    }
    else {
       return ([string stringByTrimmingCharactersInSet:nonNumberSet].length > 0);
    }   
 }

Метод очікує булева, а не рядок як повернене значення
Паскалій

4

Для тих, хто має проблеми з відповіддю Якова, я реалізував свій підклас текстового поля наступним чином, і він чудово працює!

#import <UIKit/UIKit.h>

@class HTTextField;

@protocol HTBackspaceDelegate <NSObject>

@optional
- (void)textFieldDidBackspace:(HTTextField*)textField;
@end

@interface HTTextField : UITextField<UIKeyInput>

@property (nonatomic, assign) id<HTBackspaceDelegate> backspaceDelegate;

@end


#import "HTTextField.h"

@implementation HTTextField

- (void)deleteBackward {
    [super deleteBackward];
    if ([self.backspaceDelegate respondsToSelector:@selector(textFieldDidBackspace:)]){
        [self.backspaceDelegate textFieldDidBackspace:self];
    }
}

- (BOOL)keyboardInputShouldDelete:(UITextField *)textField {
    BOOL shouldDelete = YES;

    if ([UITextField instancesRespondToSelector:_cmd]) {
        BOOL (*keyboardInputShouldDelete)(id, SEL, UITextField *) = (BOOL (*)(id, SEL, UITextField *))[UITextField instanceMethodForSelector:_cmd];

        if (keyboardInputShouldDelete) {
            shouldDelete = keyboardInputShouldDelete(self, _cmd, textField);
        }
    }

    if (![textField.text length] && [[[UIDevice currentDevice] systemVersion] intValue] >= 8) {
        [self deleteBackward];
    }

    return shouldDelete;
}

@end

ви можете написати код для швидкого. У мене з’явилася помилка «надмірне підтвердження протоколу uikeyinput»
Радж Агравал

4

Так, використовуйте метод нижче для виявлення зворотної області, коли textField порожній.

Потрібно додати UITextFieldDelegate

yourTextField.delegate = Я (ОБОВ'ЯЗКОВО)

Швидкий:

func keyboardInputShouldDelete(_ textField: UITextField) -> Bool { 
    return true
}

Мета C:

- (BOOL)keyboardInputShouldDelete:(UITextField *)textField { 
    return YES; 
}

5
Це навіть не вимагає мене. Усі інші методи делегування викликаються як і коли для події.
Хеман

Дякую, товариш .. Ти це прибив. :)
МС.

@ McDonal_11 Думаю, ви забули встановити textfield.delegate = "Я" текстового поля.
Himanshu padia

Я поставив. інші методи делегата UITextField працюють нормально. Цей один не працює. Що я сумую ??
McDonal_11

3

Найкраще використання, яке я знайшов для виявлення зворотного простору, - це виявлення, коли користувач натиснув його на порожній простір UITextField. Наприклад, якщо у поштовій програмі ви отримали "бульбашку" одержувачів, під час натискання на зворотній простір уUITextField він вибирає останнього одержувача, який "бульбашку".

Це можна зробити аналогічно до відповіді Якова Карабалло. Але у відповіді Якова, якщо у UITextFieldвас потрапив один символ, коли ви натискаєте на простір, до моменту отримання повідомлення про делегат, воно UITextFieldвже буде порожнім, тому ви ефективно виявляєтеbackspace в текстовому полі щонайбільше одного символу.

Насправді, якщо ви хочете виявити backspaceна a UITextFieldз точно нульовими символами (порожніми), вам слід надіслати повідомлення до delegateдзвінка до super deleteBackward. Наприклад:

#import "MyTextField.h"

//Text field that detects when backspace is hit with empty text
@implementation MyTextField

#pragma mark - UIKeyInput protocol
-(void)deleteBackward
{
  BOOL isTextFieldEmpty = (self.text.length == 0);
  if (isTextFieldEmpty) {
    if ([self.delegate 
         respondsToSelector:@selector(textFieldDidHitBackspaceWithEmptyText:)]) {

        [self.delegate textFieldDidHitBackspaceWithEmptyText:self];
        }
    }
    [super deleteBackward];
}
@end

Інтерфейс для такого текстового поля виглядатиме приблизно так:

@protocol MyTextFieldDelegate;

@interface MyTextField : UITextField
@property(nonatomic, weak) id<MyTextFieldDelegate> delegate;
@end

@protocol MyTextFieldDelegate <UITextFieldDelegate>
@optional
-(void)textFieldDidHitBackspaceWithEmptyText:(MyTextField *)textField;
@end

2
Для того, щоб це працювало в iOS8 (там, де помилка призводить до того, що цей метод делегата ніколи не викликається), див. Цю відповідь: stackoverflow.com/a/25862878/893101 . Детальніше про помилку ios8: devforums.apple.com/message/1009150#1009150
pIkEL

2

В iOS 6 метод deleteBackward викликається на UITextField, коли натискається зворотний простір, у тому числі, коли поле порожнє. Таким чином, ви можете підкласифікувати UITextField і надати власну реалізацію deleteBackward (посилаючись на супер).

Я все ще підтримую iOS 5, хоча мені потрібна комбінація відповіді Ендрю і цього.


1

:) якраз для назви "Виявити зворотній простір", де я використовую UIKeyboardTypeNumberPad .

Я також зустрічаюсь із тим же питанням сьогодні ввечері, і наступний мій код, щоб дізнатися його:

- (BOOL)textField:(UITextField *)textField 
        shouldChangeCharactersInRange:(NSRange)range 
        replacementString:(NSString *)string
{
    NSLog([NSString stringWithFormat:@"%d", [string length]]);
}

Тому що с UIKeyboardTypeNumberPad , користувач може вводити лише число або зворотну простір, тому коли довжина рядка дорівнює 0, це повинна бути клавіша зворотної області.

Сподіваюся, що вищесказане допоможе.


Те ж саме з будь-яким типом клавіатури.
ma11hew28

як підключити цей метод до мого текстового поля?
user230910

1

Замість того, щоб намагатися заздалегідь побудувати те, що буде в текстовому полі чи з'ясувати, який спеціальний символ було введено у shouldChangeCharactersInRangeметоді, я б запропонував зробити наступне:

[self performSelector:@selector(manageSearchResultsDisplay) 
           withObject:nil 
           afterDelay:0];

Це дозволяє викликати метод безпосередньо після завершення поточної операції. Що в цьому цікаво, це те, що до моменту його завершення змінене значення вже буде в UITextField. У цей момент ви можете просто перевірити його довжину та / або підтвердити, виходячи з того, що там є.


1

Підкласифікація UITextField не працювала для мене на iOS 8.3, deleteBackward ніколи не викликався.

Ось рішення, яке я використав, працює на всіх версіях iOS 8 і повинен працювати і на інших версіях iOS

for textField in textFields {
            textField.text = " "
}

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        if string == "" && textField.text == " "   {
            // Do stuff here
            return false
        }
        return true
}

1

У .h файл додайте делегат UIKeyInput

- (BOOL)keyboardInputShouldDelete:(UITextField *)textField {

if ([textField isEqual:_txtFirstDigit]) {

}else if([textField isEqual:_txtSecondDigit]) {
    [_txtFirstDigit becomeFirstResponder];

}else if([textField isEqual:_txtThirdDigit]) {
    [_txtSecondDigit becomeFirstResponder];

}else if([textField isEqual:_txtFourthDigit]) {
    [_txtThirdDigit becomeFirstResponder];
}
return YES;
}   

покращене форматування


1

Я реалізував подібне рішення з незначними вдосконаленнями, які підкажуть мені, що якщо текстове поле має якесь значення, тоді як користувач торкнувся зворотної області. Це корисно для мого випадку, коли я повинен зосередитися лише на іншому текстовому полі, якщо текстове поле порожнє при натисканні на зворотну простір.

protocol MyTextFieldDelegate : UITextFieldDelegate {
    func textFieldDidDelete(textField: MyTextField, hasValue: Bool)
}

override func deleteBackward() {
    let currentText = self.text ?? ""
    super.deleteBackward()
    let hasValue = currentText.isEmpty ? false : true
    if let delegate = self.delegate as? MyTextFieldDelegate {
        delegate.textFieldDidDelete(textField: self, hasValue: hasValue)
    }
}

1

У самій топольній відповіді відсутнє одне - можливість виявити, чи було текстове поле порожнім чи ні.

Тобто, коли ви перекриєте метод deleteBackwards () підкласу TextField, ви все ще не знаєте, чи було текстове поле вже порожнім. (І до, і після deleteBackwards () textField.text!- порожній рядок:"" )

Ось моє поліпшення, з перевіркою на порожнечу перед видаленням.

1. Створіть протокол делегата, який розширює UITextFieldDelegate

protocol MyTextFieldDelegate: UITextFieldDelegate {
    func textField(_ textField: UITextField, didDeleteBackwardAnd wasEmpty: Bool)
}

2. Підклас UITextField

class MyTextField: UITextField {
    override func deleteBackward() {
        // see if text was empty
        let wasEmpty = text == nil || text! == ""

        // then perform normal behavior
        super.deleteBackward()

        // now, notify delegate (if existent)
        (delegate as? MyTextFieldDelegate)?.textField(self, didDeleteBackwardAnd: wasEmpty)
    }
}

3. Реалізуйте новий протокол делегата

extension MyViewController: MyTextFieldDelegate {
    func textField(_ textField: UITextField, didDeleteBackwardAnd wasEmpty: Bool) {
        if wasEmpty {
            // do what you want here...
        }
    }
}

1

Комплексний обробник текстового поля з одноцифровим номером для Swift 5.1 :

  • Якщо припустити, що у вас є розетка колекції текстових полів (з підключеними делегатами)

1 крок

protocol MyTextFieldDelegate: class {
    func textField(_ textField: UITextField, didDeleteBackwardAnd wasEmpty: Bool) 
}

final class MyTextField: UITextField {

    weak var myDelegate: MyTextFieldDelegate?

    override func deleteBackward() {
        let wasEmpty = text == nil || text == ""

        // then perform normal behavior
        super.deleteBackward()

        // now, notify delegate (if existent)
        (delegate as? MyTextFieldDelegate)?.textField(self, didDeleteBackwardAnd: wasEmpty)
    }
}

2 Крок

final class ViewController: UIViewController {

    @IBOutlet private var textFields: [MyTextField]!

    override func viewDidLoad() {
        super.viewDidLoad()
        textFields.forEach {
            $0.delegate = self
            $0.myDelegate = self
        }
    }
}

3 крок

extension ViewController: UITextFieldDelegate, MyTextFieldDelegate {
    func textFieldHasChanged(with text: String, _ tag: Int, for textField: UITextField) {
        textField.text = text

        if let someTextField = (textFields.filter { $0.tag == tag }).first {
            someTextField.becomeFirstResponder()
        } else {
            view.endEditing(true)
        }
    }

    func textField(_ textField: UITextField, didDeleteBackwardAnd wasEmpty: Bool) {
        // If the user was pressing backward and the value was empty, go to previous textField
        textFieldHasChanged(with: "", textField.tag - 1, for: textField)
    }

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        // Restrict to only digits
        let aSet = NSCharacterSet(charactersIn: "0123456789").inverted
        let compSepByCharInSet = string.components(separatedBy: aSet)
        let numberFiltered = compSepByCharInSet.joined(separator: "")

        guard string == numberFiltered, let text = textField.text else { return false }

        if text.count >= 1 && string.isEmpty {
            // If the user is deleting the value
            textFieldHasChanged(with: "", textField.tag - 1, for: textField)
        } else {
            textFieldHasChanged(with: string, textField.tag + 1, for: textField)
        }

        return false
    }
}

0

Ось моє рішення, засноване на ідеї @andrew:

десь, наприклад у viewDidLoad

        textField.delegate = self
        textField.addTarget(self, action: #selector(valueChanged(_:)), for: .editingDidBegin)

і потім

    @objc func valueChanged(_ textField: UITextField) {
        textField.text = "\u{200B}"
    }

    override func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        textField.text = string
        if string == "" {
            //backpaspace pressed 
        }

0

Ви можете перевірити текст текстового перегляду / поля, щоб побачити, чи він порожній, і переконайтеся, що текст заміни також порожній у методі делегата повиненChangeTextIn.

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    if (textView.text == "" && text == "") {
        print("Backspace on empty text field.")
    }
    return true
}

-2

Щось на зразок цього:

- (BOOL)textField:(UITextField *)textField 
        shouldChangeCharactersInRange:(NSRange)range 
        replacementString:(NSString *)string       
{  
    if (![text hash] && ![textField.text length])  
        [self backspaceInEmptyTextField];  
}

звичайно, хеш призначений для одного символьного рядка.


-2

Використовуючи метод TextField Delegate:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

Додайте наступний код у вищевказаний метод для виявлення події видалення

if(textField == YourTextField)
{
    if ([string length] == 0 && range.length > 0)
    {
        // Your Code after deletion of character
    }
}


-3
+ (BOOL)detectBackspaceOnly:(NSString *)string
{
    for(int i=0 ; i<string.length ; i++){
        unichar caract = [string characterAtIndex:i];
        if(caract != ' ' && caract != '\n')
            return NO;
    }

    return YES;
}

2
Може, трохи пояснення, куди це поставити?
Алекс Ціо

-4

В UITextViewDelegate:

- (BOOL)               textView:(UITextView *)textView 
        shouldChangeTextInRange:(NSRange)range 
                replacementText:(NSString *)text
{
    if(text isEqualToString:@"");
    {
        NSLog(@"press backspace.");
    }
}

це працює добре для мене.

оновлення для спрощеного китайського пиньїна та китайського рукописного вводу:

- (BOOL)               textView:(UITextView *)textView 
        shouldChangeTextInRange:(NSRange)range 
                replacementText:(NSString *)text
{
    if (range.length > 0 && [text isEqualToString:@""]) {
        NSLog(@"press Backspace.");
    }
    return YES;
}

база в документі говорить:

"Якщо користувач натискає кнопку deleteKey, довжина діапазону дорівнює 1, а порожній рядковий об'єкт замінює цей єдиний символ."


1
Це питання про UITextField, ні UITextView.
ma11hew28
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.