كيف يمكنك استبعاد لوحة المفاتيح عند تحرير ملف UITextField

StackOverflow https://stackoverflow.com/questions/274319

سؤال

أعلم أنني بحاجة إلى إخبار UITextField الخاص بي بالاستقالة من المستجيب الأول عندما أرغب في استبعاد لوحة المفاتيح، لكنني لست متأكدًا من كيفية معرفة متى قام المستخدم بالضغط على مفتاح "تم" على لوحة المفاتيح.هل هناك إشعار يمكنني مشاهدته؟

هل كانت مفيدة؟

المحلول

وأنا وضعت مندوب UITextField إلى صفي ViewController.

في تلك الفئة I تنفذ هذه الطريقة على النحو التالي:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return NO;
}

نصائح أخرى

إذا قمت بالاتصال الحدث DidEndOnExit من حقل النص لإجراء (IBAction) في InterfaceBuilder، سيتم بعث برسالة أنه عندما يقوم المستخدم يرفض لوحة المفاتيح (مع مفتاح العودة) وسوف المرسل أن يكون إشارة إلى UITextField التي اطلقت هذا الحدث.

وعلى سبيل المثال:

-(IBAction)userDoneEnteringText:(id)sender
{
    UITextField theField = (UITextField*)sender;
    // do whatever you want with this text field
}

وبعد ذلك، في InterfaceBuilder، ربط الحدث DidEndOnExit من حقل النص لهذا الإجراء على جهاز تحكم (أو ما كنت تستخدم لربط الأحداث من UI). كلما يقوم المستخدم بإدخال النص ويرفض حقل النص، وسوف ترسل وحدة التحكم هذه الرسالة.

ويمكنك أيضا إنشاء أسلوب في وحدة التحكم الخاصة بك

 -(IBAction)editingEnded:(id)sender{
    [sender resignFirstResponder]; 
}

وبعد ذلك في اتصال المفتش في IB ربط الحدث "هل تنتهي يوم الخروج" لذلك.

وكوبي، وذلك بفضل. عملت التعليمات البرمجية. لمجرد أن تكون واضحة (للنوبي مثل) كما تقول لديك لتعيين UITextField وdelegate ليكون مساويا لViewController الذي توجد حقل النص. يمكنك القيام بذلك في أي مكان يحلو لك. اخترت طريقة viewDidLoad.

- (void)viewDidLoad 
{
    // sets the textField delegates to equal this viewController ... this allows for the keyboard to disappear after pressing done
    daTextField.delegate = self;
}

وهنا هو خدعة للحصول على سلوك لوحة المفاتيح الفصل التلقائي مع أي رمز على الإطلاق. في بنك الاستثمار القومي، وتحرير الكائن الوكيل المستجيب الأول في عارض الهوية، إضافة عمل جديد أول مستجيب. دعنا نسميها dummy:. الآن ربط هل وضع حد على الحدث خروج من حقل النص لعمل dummy: لكائن الوكيل المستجيب الأول. هذا هو! منذ مجال النص ألم النهاية على الحدث الخروج الآن لديه الزوج العمل المستهدفة، حقل النص تلقائيا ترفض وحة المفاتيح لها عندما ينقر المستخدم العودة. ونظرا لعدم وجود عقوبة لعدم العثور على معالج رسالة ارسلت الى سلسلة الرد، والتطبيق لا تحطم على الرغم من عدم وجود تنفيذ dummy: في أي مكان.

وأضيف

[textField endEditing:YES];

حيث تريد تعطيل لوحة المفاتيح وعرض وجهة نظر منقار.

في Swift، يمكنك كتابة IBAction في وحدة التحكم وتعيين هل انتهى عند الخروج حدث حقل النص لهذا الإجراء

@IBAction func returnPressed(sender: UITextField) {
    self.view.endEditing(true)
}

ويمكنك أيضا استخدام

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
  {

   [self.yourTextField resignFirstResponder];

  }

وأفضل واحد إذا لديك العديد Uitextfields:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 {    
     [self.view endEditing:YES];
 }

إليك ما كان علي فعله لتشغيله، وأعتقد أنه ضروري لأي شخص لديه لوحة أرقام للوحة المفاتيح (أو أي لوحة أخرى لا تحتوي على زر تم):

  1. لقد قمت بتغيير UIView في ViewController إلى UIControl.
  2. لقد قمت بإنشاء وظيفة تسمى

    -(IBAction)backgroundIsTapped:(id)sender
    

تم تعريف هذا أيضًا في ملف .h.

بعد ذلك، قمت بالربط بجزء "اللمس لأسفل" الخاص بـ ViewController في Interface Builder.

في وظيفة "يتم استغلال الخلفية"، أضع هذا:

    [answerField resignFirstResponder];

فقط تذكر تغيير "answerField" إلى اسم UITextField الذي تريد إزالة لوحة المفاتيح منه (من الواضح تأكد من تعريف UITextField كما هو موضح أدناه :)

    IBOutlet UITextField * <nameoftextfieldhere>;

أعرف أن هذا الموضوع ربما مات منذ زمن طويل..لكنني آمل أن يساعد هذا شخصًا ما في مكان ما!

وستلاحظ أن طريقة "textFieldShouldReturn" يوفر الكائن حقل النص الذي ضرب مفتاح حررت. إذا قمت بتعيين TAG يمكنك التبديل على أن حقل النص. أو يمكنك تتبع ومقارنة مؤشر الكائن مع بعض القيمة عضو تخزينها من قبل الخالق.

وتوجهي هو من هذا القبيل لدراسة الذاتي:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    NSLog(@"%s", __FUNCTION__);

    bool fDidResign = [textField resignFirstResponder];

    NSLog(@"%s: did %resign the keyboard", __FUNCTION__, fDidResign ? @"" : @"not ");

    return fDidResign;
}

وفي الوقت نفسه، وضعت "التحقق" الاختبار الذي ينفي استقالة يتبع. أنها ليست سوى من أجل التوضيح، لذلك إذا قام المستخدم بكتابة NO! في هذا المجال، فإنه لن يصرف. كان سلوك كما أردت، ولكن تسلسل الناتج ليس كما كنت أتوقع.

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
    NSLog(@"%s", __FUNCTION__);

    if( [[textField text] isEqualToString:@"NO!"] ) {
        NSLog(@"%@", textField.text);
        return NO;
    } else {
        return YES;
    }
}

وفيما يلي الناتج NSLog بلدي لهذا الإنكار تليها القبول. ستلاحظ أن أعود نتيجة الاستقالة، ولكن كنت أتوقع أن يعود FALSE لي أن يقدم تقريرا إلى المتصل ؟! عدا ذلك، فإنه لديه السلوك الضرورية.

13.313 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]
13.320 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldEndEditing:]
13.327 StudyKbd[109:207] NO!
13.333 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: did resign the keyboard
59.891 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]
59.897 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldEndEditing:]
59.917 StudyKbd[109:207] -[StudyKbdViewController doneEditText]: NO
59.928 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: did resign the keyboard

إليك طريقة نظيفة تمامًا لإنهاء الإصدار باستخدام مفتاح الإرجاع أو لمسة في الخلفية.

في Interface Builder، قم بتضمين الحقول الخاصة بك في طريقة عرض للفئة UIFormView

ماذا يفعل هذا الصف :

  • إرفاق نفسه تلقائيًا كمفوض للحقول (إما أن يتم تنشيطه من المنقار أو إضافته يدويًا)
  • احتفظ بمرجع في الحقل المحرر الحالي
  • قم بتجاهل لوحة المفاتيح عند العودة أو المس في الخلفية

هنا هو الرمز:

واجهه المستخدم

#import <UIKit/UIKit.h>

@interface UIFormView : UIView<UITextFieldDelegate>

-(BOOL)textFieldValueIsValid:(UITextField*)textField;
-(void)endEdit;

@end

تطبيق

#import "UIFormView.h"

@implementation UIFormView
{
    UITextField* currentEditingTextField;
}

// Automatically register fields

-(void)addSubview:(UIView *)view
{
    [super addSubview:view];
    if ([view isKindOfClass:[UITextField class]]) {
        if ( ![(UITextField*)view delegate] ) [(UITextField*)view setDelegate:self];
    }
}

// UITextField Protocol

-(void)textFieldDidBeginEditing:(UITextField *)textField
{
    currentEditingTextField = textField;
}

-(void)textFieldDidEndEditing:(UITextField *)textField
{
    currentEditingTextField = NULL;
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self endEdit];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    if ([self textFieldValueIsValid:textField]) {
        [self endEdit];
        return YES;
    } else {
        return NO;
    }
}

// Own functions

-(void)endEdit
{
    if (currentEditingTextField) {
        [currentEditingTextField endEditing:YES];
        currentEditingTextField = NULL;
    }
}


// Override this in your subclass to handle eventual values that may prevent validation.

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

@end
  • عن طريق تصنيف فرعي للنموذج وتجاوزtextFieldValueIsValid: الطريقة ، يمكنك تجنب نهاية الإصدار إذا كانت القيمة غير صحيحة للحقل المحدد.

  • إذا كان الحقل يحتوي على مفوض تم تعيينه في Interface Builder، فلن يغيره النموذج.لا أرى أسبابًا كثيرة لتعيين مندوب مختلف لمجال معين، ولكن لماذا لا...

هناك العديد من الطرق لتحسين فئة عرض النموذج هذه - قم بإرفاق مندوب، وإجراء بعض التخطيط، والتعامل عندما تغطي لوحات المفاتيح حقلاً (باستخدام إطارEditingTextField الحالي)، وبدء الإصدار تلقائيًا للحقل التالي، ...

أنا شخصيًا أحتفظ به في إطار العمل الخاص بي، وأصنفه دائمًا في فئة فرعية لإضافة ميزات، وغالبًا ما يكون مفيدًا "كما هو".

آمل أن يساعد.هتاف جميعا

إذا كنت تريد كل عمليات التحرير في UIViewController، فيمكنك استخدامها.

[[self view]endEditing:YES];

وإذا كنت تريد إخفاء لوحة مفاتيح UITextField الخاصة، فاستخدمها.

1.أضف مندوبًا في viewcontroller.h

<UITextFieldDelegate>
  1. جعل التفويض غير قادر على حقل النص الخاص بك.

    self.yourTextField.delegate = self;

  2. أضف هذه الطريقة إلى وحدة التحكم الخاصة بك.

    -(Bool) TextFieldShouldEdending: (uitextfield *) textfield {[textfield resignfirstresponder] ؛العودة نعم؛}

قم بتعيين مندوب UITextField برمجيًا في Swift 3

قم بتطبيق UITextFieldDelegate في ملف ViewController.Swift الخاص بك (مثل فئة ViewController:UIViewController، UITextFieldDelegate { )

 lazy var firstNameTF: UITextField = {

    let firstname = UITextField()
    firstname.placeholder = "FirstName"
    firstname.frame = CGRect(x:38, y: 100, width: 244, height: 30)
    firstname.textAlignment = .center
    firstname.borderStyle = UITextBorderStyle.roundedRect
    firstname.keyboardType = UIKeyboardType.default
    firstname.delegate = self
    return firstname
}()

lazy var lastNameTF: UITextField = {

    let lastname = UITextField()
    lastname.placeholder = "LastName"
    lastname.frame = CGRect(x:38, y: 150, width: 244, height: 30)
    lastname.textAlignment = .center
    lastname.borderStyle = UITextBorderStyle.roundedRect
    lastname.keyboardType = UIKeyboardType.default
    lastname.delegate = self
    return lastname
}()

lazy var emailIdTF: UITextField = {

    let emailid = UITextField()
    emailid.placeholder = "EmailId"
    emailid.frame = CGRect(x:38, y: 200, width: 244, height: 30)
    emailid.textAlignment = .center
    emailid.borderStyle = UITextBorderStyle.roundedRect
    emailid.keyboardType = UIKeyboardType.default
    emailid.delegate = self
    return emailid
}()

// مارك: - التعامل مع مندوب textField..

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    view.endEditing(true)
}

func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    if textField == firstNameTF {

        lastNameTF.becomeFirstResponder()
    }

    else if textField == lastNameTF {

        emailIdTF.becomeFirstResponder()
    }
    else {
        view.emailIdTF(true)
    }
    return true
}

وإنشاء hidekeyboard وظيفة وربطه إلى حيز النص في ملف .xib وحدد DidEndOnExit

-(IBAction)Hidekeyboard    
{    
      textfield_name.resignFirstResponder;    
}  

إذا كنت قد أنشأت طريقة العرض باستخدام واجهة البناء، استخدم التالية مجرد إنشاء أسلوب،

-(IBAction)dismissKeyboard:(id)sender
{
[sender resignFirstResponder];
}

وفقط انقر على الحق في حقل النص في طريقة العرض، وتعيين الحدث كما فعل إنهاء على إنهاء، والأسلاك إلى الأسلوب "dismissKeyboard".

وأفضل دليل للمبتدئين هو       "أول رئيس iPhone و iPad التنمية، 2nd الطبعة"

وهذه محاولة

- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
{
    if ([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }
    return YES;
}
//====================================================
//                  textFieldShouldReturn:
//====================================================
-(BOOL) textFieldShouldReturn:(UITextField*) textField { 
    [textField resignFirstResponder];
    if(textField.returnKeyType != UIReturnKeyDone){
        [[textField.superview viewWithTag: self.nextTextField] becomeFirstResponder];
    }
    return YES;
}

أي شخص يبحث عن سويفت 3

1) تأكد من مندوب UITextField يتم توصيله بجهاز ViewController الخاص بك في لوحة العمل

2) التنفيذ UITextFieldDelegate في ملف ViewController.Swift الخاص بك (مثل فئة ViewController:UIViewController، UITextFieldDelegate { )

3) استخدم طريقة المفوض أدناه

func textFieldShouldReturn(textField: UITextField) -> Bool { 
   textField.resignFirstResponder()  
return false }

وهذه هي الطريقة التي يمكنني استبعاد لوحة المفاتيح في سويفت 4.2 ويعمل بالنسبة لي:

    override func viewDidLoad() {
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action: 
    #selector(dismissKeyboard))

    view.addGestureRecognizer(tap)
    }

    @objc func dismissKeyboard (_ sender: UITapGestureRecognizer) {
    numberField.resignFirstResponder()
    }

وسويفت 3، دائرة الرقابة الداخلية 9 +

و@IBAction private func noteFieldDidEndOnExit(_ sender: UITextField) {}

وUPD: إنه لا يزال يعمل بشكل جيد بالنسبة لي. أعتقد أن الرجل الذي كرس هذه الإجابة فقط لم يفهم انه في حاجة لربط هذا العمل إلى UITextField في لوحة العمل.

textField.returnKeyType = UIReturnKeyDone;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top