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




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

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


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

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

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

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

-(IBAction)removeKeyboard;

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

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

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

آمل أن يساعد!


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

في طريقة عرض وحدة التحكم ، سيبدو الأمر كالتالي:

[self.view endEditing:YES];

تفرض المعلمة حقل النص على الاستبدال بحالة المستجيب الأول. إذا كنت تستخدم مفوضاً لإجراء التحقق من الصحة وكنت تريد إيقاف كل شيء حتى تصبح محتويات حقل النص صالحة ، فيمكنك أيضًا ترميزها كما يلي:

BOOL didEndEditing = [self.view endEditing:NO];
if (didEndEditing) {
    // on to the next thing...
} else {
    // text field must have said to first responder status: "never wanna give you up, never wanna let you down"
}

طريقة endEditing: الطريقة أفضل بكثير من إخبار حقول النص الفردية resignFirstResponder ، ولكن لسبب ما لم resignFirstResponder حتى وقت قريب.


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

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]);

في ملف Your view Control Controller الخاص بك ، تأكد من تنفيذ بروتوكول UITextFieldDelegate:

@interface YourViewController : <UITextFieldDelegate>

@end

ثم ، في ملف YourViewController.m ، قم بتطبيق أسلوب المثيل التالي:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.yourTextField1 resignFirstResponder];
    [self.yourTextField2 resignFirstResponder];
    ...
    [self.yourTextFieldn resignFirstResponder];
}

كملاذ أخير 💩

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

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

UIApplication.shared.keyWindow?.endEditing(true)

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

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


لقد اكتشفت حالة 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)

3 خطوات بسيطة وسريعة

أضف UITextFieldDelegate إلى صفك على النحو التالي:

class RegisterVC: UIViewController, UITextFieldDelegate {
    //class implementation 
}

في تطبيق الفئة ، قم بإضافة وظيفة التفويض textFieldShouldEndEditing: ::

internal func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    self.view.endEditing(true)
    return true
}

وكخطوة أخيرة ، قم بتعيين UITextField ( UITextField ) UITextField (s) إلى self ، في مكان مناسب. على سبيل المثال ، داخل وظيفة viewDidLoad :

override func viewDidLoad(){
    super.viewDidLoad()
    myTextField1.delegate = self
    myTextField2.delegate = self
    ..
    ..
}

الآن ، عندما ينتقل المستخدم إلى مفتاح العودة ، سيتم رفض لوحة المفاتيح.

أعددت مقتطفًا أيضًا ، يمكنك التحقق منه من here .


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

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


[myTextField resignFirstResponder]

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





keyboard