uitextfield تفقد الحدث التركيز
-
16-09-2019 - |
سؤال
لدي 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()
}