سؤال

لدي uitextfield في فئة mycustomuiview وعندما تركز uitextfield يفقد، أود إخفاء الحقل وإظهار شيء آخر في مكانه.

مندوب UITextField تم تعيين إلى MyCustomUIView عبر IB وأنا أيضا "لقد انتهيت عند الخروج" و "التحرير قد انتهت" الأحداث التي تشير إلى IBAction طريقة داخل MyCustomUIView.

@interface MyCustomUIView : UIView { 

IBOutlet UITextField    *myTextField;

}

-(IBAction)textFieldLostFocus:(UITextField *)textField;

@end

ومع ذلك، لا يبدو أن أي من هذه الأحداث يطلق النار عندما يخسر Uitextfield. كيف يمكنك فخ / البحث عن هذا الحدث؟

مندوب UITextField يتم تعيين as. MyCustomUIView لذلك أنا أتلقى textFieldShouldReturn رسالة لإقالة لوحة المفاتيح عند الانتهاء.

ولكن ما أنا مهتم أيضا بالهتمي عندما يضغط المستخدم على بعض المنطقة الأخرى على الشاشة (قل عنصر تحكم آخر أو منطقة فارغة فقط) وقد فقد حقل النص التركيز.

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

المحلول

أعتقد أنك بحاجة إلى تعيين وجهة نظرك كمفوض Uitextfield مثل ذلك:

@interface MyCustomUIView : UIView <UITextFieldDelegate> { 

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

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
  //This line dismisses the keyboard.       
  [theTextField resignFirstResponder];
  //Your view manipulation here if you moved the view up due to the keyboard etc.       
  return YES;
}

نصائح أخرى

حاول استخدام المندوب للطريقة التالية:

- (BOOL) textFieldShouldEndEditing:(UITextField *)textField {
    NSLog(@"Lost Focus for content: %@", textField.text);
    return YES;
}

التي عملت بالنسبة لي.

المشكلة مع resignfirstrespond. الحل فقط هو أنه لا يمكن تشغيله إلا من خلال صريح لوحة المفاتيح أو uitext حدث. كنت أبحث أيضا عن "حدث التركيز المفقود" لإخفاء لوحة المفاتيح، إذا تم استغلال موقع Text الموجود في مكان ما. تعطيل "الحل" القريب والعملية الوحيد هو، لتعطيل التفاعلات لآراء أخرى حتى ينتهي المستخدم مع التحرير (الضرب / الإرجاع على لوحة المفاتيح) ولكن لا يزال قادرا على القفز بين القصص النصية لإجراء تصحيحات دون الحاجة إلى الانزلاق في لوحة المفاتيح في كل مرة.

المقتطف التالي ربما مفيد لشخص ما، الذي يريد أن يفعل الشيء نفسه:

// disable all views but textfields
// assign this action to all textfields in IB for the event "Editing Did Begin"
-(IBAction) lockKeyboard : (id) sender {

    for(UIView *v in [(UIView*)sender superview].subviews)
        if (![v isKindOfClass:[UITextField class]]) v.userInteractionEnabled = NO;
}

// reenable interactions
// assign this action to all textfields in IB for the event "Did End On Exit"
-(IBAction) disMissKeyboard : (id) sender {

    [(UIResponder*)sender resignFirstResponder]; // hide keyboard

    for(UIView *v in [(UIView*)sender superview].subviews)
        v.userInteractionEnabled = YES;
}

قد تضطر إلى الفئة الفرعية UITextField وتجاوز resignFirstResponder. resignFirstResponder سيتم استدعاء تماما مثل حقل النص يفقد التركيز.

أعتقد أنك قد نفذت UIKeyboardDidHideNotification وفي هذا الحدث لك

استخدام رمز مثل

[theTextField resignFirstResponder];

إزالة هذا الرمز.

أيضا نفس الكود الكتابة في textFieldShouldReturn طريقة. هذا أيضا فقد التركيز.

بالنسبة لأولئك الذين يكافحون مع هذا في سويفت. نضيف أداة تعريف لفتة إلى عرض ViewController بحيث عند استغلال العرض، نرفض TextField. من المهم عدم إلغاء النقرات اللاحقة في العرض.

سويفت 2.3.

    override func viewDidLoad() {
        //.....

        let viewTapGestureRec = UITapGestureRecognizer(target: self, action: #selector(handleViewTap(_:)))
        //this line is important
        viewTapGestureRec.cancelsTouchesInView = false
        self.view.addGestureRecognizer(viewTapGestureRec)

         //.....
    }

    func handleViewTap(recognizer: UIGestureRecognizer) {
        myTextField.resignFirstResponder()
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top