كيف يمكنني استبعاد لوحة مفاتيح iOS؟




مشكلة لوحة مفاتيح الايفون (13)

هناك حالات حيث لا يوجد حقل نص هو المستجيب الأول ولكن لوحة المفاتيح على الشاشة. في هذه الحالات ، تفشل الطرق المذكورة أعلاه في تجاهل لوحة المفاتيح.

مثال على كيفية الوصول إلى هناك:

  1. دفع ABPersonViewController على الشاشة برمجياً؛ فتح أي اتصال
  2. المس حقل "الملاحظة" (الذي يصبح المستجيب الأول ويطلق لوحة المفاتيح) ؛
  3. اسحب إلى اليسار في أي حقل آخر لإظهار الزر "حذف" ؛
  4. عند هذه النقطة لا يوجد مستجيب أول بين حقول النص (فقط تحقق برمجياً) ولكن لوحة المفاتيح لا تزال موجودة. الاتصال [view endEditing: YES] لا يفعل شيئًا.

في هذه الحالة ، يجب أيضًا أن تطلب من وحدة التحكم في العرض إنهاء وضع التحرير:

[viewController setEditing:NO animated:YES];

لدي UITextfield الذي أود إقالة لوحة المفاتيح من أجله. لا أستطيع أن يبدو لجعل لوحة المفاتيح تختفي بغض النظر عن الرمز الذي أستخدمه.


-(void)textFieldDidBeginEditing:(UITextField *)textField
{
    // your code

    [textField reloadInputViews];
}

سيؤدي ذلك إلى إعادة تعيين حقل نص معين

// Swift
TextField.resignFirstResponder()

// Objective C
[TextField resignFirstResponder];

لإعادة استخدام أي حقل نصي أسفل الكود

// Swift
self.view!.endEditing(true)

// Objective C
[self.view endEditing:YES];

لقد اكتشفت حالة endEditing فيها endEditing و resignFirstResponder . وقد عمل هذا بالنسبة لي في تلك الحالات.

ObjC

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];    
[self setEditing:NO];

سريع

UIApplication.shared.sendAction(#selector(resignFirstResponder), to: nil, from: nil, for: nil)

لإعادة تعيين أي حقل نصي في التطبيق

UIApplication.shared.keyWindow?.endEditing(true)

هذه الطريقة نظيفة و مضبوطة للعمل لأن keyWindow هو ، بحكم تعريفه ، عرض الجذر لكل وجهات النظر الممكنة التي تعرض لوحة المفاتيح ( source ):

تستقبل نافذة المفتاح لوحة المفاتيح والأحداث الأخرى غير المرتبطة باللمس. نافذة واحدة فقط في كل مرة قد تكون النافذة الرئيسية.


إذا كنت لا تعرف النص الذي هو أول مستجيب يمكنك العثور عليه. أنا استخدم هذه الوظيفة:

UIView *resignFirstResponder(UIView *theView)
{
    if([theView isFirstResponder])
    {
        [theView resignFirstResponder];
        return theView;
    }
    for(UIView *subview in theView.subviews)
    {
        UIView *result = resignFirstResponder(subview);
        if(result) return result;
    }
    return nil;
}

ثم في مكالمة رمزك:

    UIView *resigned = resignFirstResponder([UIScreen mainScreen]);

أنت فقط استبدال yourTextFieldName مع ، كنت تفكر في ذلك! حقل النص الخاص بك. هذا سوف يغلق لوحة المفاتيح.

[yourTextFieldName resignFirstResponder];

[myTextField resignFirstResponder]

Here ، الفقرة الثانية في قسم إدارة لوحة المفاتيح.


كملاذ أخير 💩

let dummyTextView = UITextView(frame: .zero)
view.addSubView(dummyTextView)
dummyTextView.becomeFirstResponder()
dummyTextView.resignFirstResponder()

-(void)methodName
{
    [textFieldName resignFirstResponder];
}

استدعاء هذا الأسلوب (methodName) مع didEndOnExit


  1. قم بإعداد حدث "هل انتهى عند الخروج" في Xcode (انقر بزر الماوس الأيمن على حقل النص الخاص بك).

  2. أدرك هذه الطريقة:

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

ل Swift 3

يمكنك إخفاء لوحة المفاتيح كما يلي:

textField.resignFirstResponder()

إذا كنت ترغب في إخفاء لوحة المفاتيح عندما يقوم المستخدم بالضغط على زر "المقدمة" ، يجب عليك تنفيذ طريقة UITextFieldDelegate التالية:

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

    textField.resignFirstResponder()

    return true
}

أقترح عليك إضافة وإجراء على ملف رأسك:

-(IBAction)removeKeyboard;

وفي التنفيذ ، اكتب شيئًا كهذا:

-(IBAction)removeKeyboard
{
[self.textfield resignFirstResponder];
}

في ملف NIB ، الاتصال من UITextFiled إلى "مالك الملف" على الخيار DidEndOnExit. بهذه الطريقة ، عندما تضغط على العودة ، ستختفي لوحة المفاتيح.

آمل أن يساعد!





keyboard