لا يدعم iPhone uitextView أجهزة الكشف عن البيانات عندما تكون طريقة عرض النص قابلة للتحرير

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

سؤال

أحصل على تحذير مثير للاهتمام في وقت البناء (iPhone Simulator) يعطي ما يلي:

EditView.xib:35:0 UITextView does not support data detectors when the text view is editable.

هذا غير موجود بشكل أساسي على Google وأرغب في إزالته.

يحتوي EditView.xib على TextView حيث أكتب ملاحظات فيها. هل هناك المزيد من المعلومات المطلوبة؟

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

المحلول

كنت أرى هذا التحذير كذلك. إليك كيف أصلحته:

في ملف XIB في Builder Interface ، حدد عرض النص الخاص بك ، وقم بإحضار مفتش السمات. تأكد من أن "اكتشاف أرقام الهواتف" و "اكتشاف الروابط" لم يتم التحقق منها.

لقد تم التحقق من "اكتشاف الروابط" ، وتبين أن هذا ما كان يسبب التحذير. في الأساس ، إذا كانت TextView قابلة للتحرير ، فأنت لا تريد تشغيل هذه الميزات المكتشفة التلقائي.

نصائح أخرى

لدي أربعة XIBs مختلفة مع رؤوس نصية مماثلة يتم استخدامها للملاحظات أيضًا. كنت أحصل على نفس التحذيرات. اقتراح لتعطيل "يكتشف أرقام الهواتف" و "يكتشف الروابط" هل يزيل التحذيرات. ومع ذلك ، أردت أن لا يزال لدى المستخدمين القدرة على استخدام أجهزة الكشف في ملاحظاتي.

هذه هي الطريقة التي حللت بها المشكلة في تطبيقي:

  1. في IB: لقد قمت بإلغاء تحديد الممتلكات الخاصة بـ TextView. -(الذي يوقف تحذيرات البناء).

  2. في - (void)viewDidLoad { قمت بتعيين خصائص TextView إلى ما يلي:myTextView.dataDetectorTypes = UIDataDetectorTypeAll; مما يتيح أجهزة الكشف عن البيانات من جميع الأنواع (أرقام الهواتف وعناوين URL).

  3. في عرض وحدة التحكم الخاصة بي: -(void)textViewDidBeginEditing:(UITextView *)sender { الطريقة ، قمت بتشغيل كاشفات البيانات إلى الوراء إيقاف استخدام: myTextView.dataDetectorTypes = UIDataDetectorTypeNone

  4. ثم الاستفادة من -(void)textViewDidEndEditing:(UITextView *)sender { الطريقة ، قمت بتشغيلها مرة أخرى على استخدام: myTextView.dataDetectorTypes = UIDataDetectorTypeAll;

تقوم هذه الطريقة بتعطيل أجهزة الكشف عن البيانات عندما يقوم المستخدم بتحرير UITextView ويعيد كاشف البيانات إلى الوراء عند الانتهاء من التحرير. يسمح هذا الإصلاح باختيار أرقام الهواتف وعنوان URL من داخل TextView ، بحيث لم أفقد الوظيفة.


لقد وجدت ما يلي في مستندات Apple على DataDetectors لـ uitextview: بعد اللعب مع uitextview لفترة من الوقت ، آمل أن يساعد ذلك.

uidatadetectortypes:

يحدد أنواع المعلومات التي يمكن اكتشافها في المحتوى المستند إلى النص.

الأنواع:

  • uidatadetectortypephonenber ؛
  • uidatadetectortypelink ؛
  • uidatadetectortypenone ؛
  • uidatadetectortypeall ؛


تحديث: 11-5-2010 ؛

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

المحلول: تحميل textview مع self.textView.editable = NO; وقم بتعيينك على uidatadetector استنادًا إلى الأنواع التي ذكرتها أعلاه. وبهذه الطريقة إذا أراد المستخدم "تحديد" عنوان الويب أو رقم الهاتف وما إلى ذلك ، يمكن للمندوب التعامل معها. عندما تحتاج إلى المستخدم لتحرير TextView ، ثم قم بتشغيل self.textView.editing = YES; وإزالة uidatadetectors وفقا لذلك. هذا يجب أن يضمن عدم وجود أخطاء أو تحذيرات أثناء التجميع.

اعتبار خاص:تأكد من إزالة Datadectors أولاً عند إعادة تهيئة ، ثم قم بتمكين "التحرير = نعم ؛" ... أمر مهم لا لتمكين التحرير إذا كان لا يزال يتم تعيين uidatadetectors.

لذلك ، يجب أن يكون ترتيب التسلسل شيئًا كهذا ...

  • لتحرير TextView: 1. قم بإزالة أجهزة الكشف عن البيانات ، 2. ثم تمكين التحرير = نعم.

  • لاستخدام أجهزة البيانات: 1. تعطيل التحرير = لا ؛ 2. ثم إضافة كاشفات البيانات.

لذلك كلمة!

textView.editable = NO;
textView.dataDetectorTypes = UIDataDetectorTypeAll;

يجب أن يبدأ عنوان عنوان URL بـ "http: //" ، وإلا فإن textview لا يمكن اكتشافه.

فكرت في محاولة استخدام إدراك تابور من أجل "تأخير stouchesbegan = نعم" و "CancelStouchesInView = لا"

لا يزال من السهل جدًا حلها!

تحميل عرض مع تعطيل قابلة للتحرير وكذلك UIDataDetectorTypeAll أو أنواع الروابط التي تريد اكتشافها. ثم أضف gesturerecognizer:

UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                             action:@selector(editTextRecognizerTabbed:)];
recognizer.delegate = self;
recognizer.numberOfTapsRequired = 1;
[self.textViewNotes addGestureRecognizer:recognizer];

لذلك يمكنك تغيير الإعدادات في هذه الطريقة:

- (void) editTextRecognizerTabbed:(UITapGestureRecognizer *) aRecognizer;
{
    self.textViewNotes.dataDetectorTypes = UIDataDetectorTypeNone;
    self.textViewNotes.editable = YES;
    [self.textViewNotes becomeFirstResponder];
}

وعلى الأقل يجب عليك تغيير إعدادات التحرير والاكتشاف مرة أخرى بعد انتهاء المستخدم من إدخال النص:

- (void)textViewDidEndEditing:(UITextView *)textView;
{
    self.textViewNotes.editable = YES;
    self.textViewNotes.dataDetectorTypes = UIDataDetectorTypeAll;
}

يعمل مثل سحر!

ستكون أجهزة الكشف عن البيانات الخاصة بـ UITextView للنسخ واللصق. نظرًا لأنك تقوم بإعدادها قابلة للتحرير ، فلا ينبغي السماح بنسخ/لصق المكان الذي تعتقد أنه يجب أن يكون اللصق ، ولكن لا ينبغي أن تكون النسخة.

يقوم Simplenote بطريقة أو بأخرى بهذا على iOS 4. (هناك إصدار مجاني/لايت في حال كنت تريد المحاولة.)

إنه مختلف قليلاً: عند النقر على أحد الأجزاء المميزة ، لا يزال يبدأ التحرير ، ولن يتبع الرابط.

ولكن عند النقر والاحتفال على datatpye المكتشفة ، فإنه يعرض Yout القائمة للاتصال ، افتح الرابط أو أي شيء آخر.

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

أي أفكار كيف تفعل ذلك؟

فكرت في محاولة استخدام إدراك تابور من أجل "تأخير stouchesbegan = نعم" و "CancelStouchesInView = لا"

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

لكن لم يكن لدي وقت لاختباره حتى الآن.

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