يهتز الكشف عن الإيماءات في فئة Uiwindow الفرعية الاستحواذ على النص الافتراضي التراجع عن المدير
-
28-09-2019 - |
سؤال
ما أريده هو إدراك تطبيق iPhone الخاص بي عن الإيماءات طوال الوقت باستثناء أي وقت مضى UITextfield
أو UITextview
تصبح firstresponder.
(تابعت هذا: https://stackoverflow.com/questions/150446/how-do-i-detect-when-someone-shakes-an-iphone/1351486#1351486i)
أنا فئة فرعية UIWindow
وتنفيذها motionEnded:withEvent:
الطريقة وهي تعمل حتى لو قمت بتعيين ملف UITextView
أن تكون firstresponder. عادتي UIWindow
المكالمات motionEnded:withEvent:
حتى لو لم يكن firstresponder.
لذا فإن المشكلة هي بلدي UItextView
لا يستجيب مدير التراجع عن الهز بعد الآن. ال UIWindow
يتولى كل التعامل مع إتفاء الهز بغض النظر عن كيفية تغيير التسلسل الهرمي أو التسلسل الهرمي.
هل يمكن لأي شخص إلقاء بعض الضوء على كيفية تعطيل اكتشاف UiWindow مؤقتًا أو يتولى استغراب Firstresponder الحالي على لفه الهز بناءً على التنفيذ الذي لدي؟
شكرا مقدما!
المحلول
على أي حال وجدت حل.
لا يزال مدير التراجع الافتراضي في الواقع هناك توفير جميع الإجراءات التي تم إجراؤها على uitextview سراً.
حيث UIWindow
يتولى معالجة الحركة ، أولاً أحاول استعادتها عن طريق تجاوز motionEnded:withEvent:
في ViewController الذي يحتوي على بلدي UITextView
.
ثانياً ، احصل على المراوغة [myTextView undoManager]
ثم يمكنك إرسال undo
أو redo
رسائل إليها.
الآن لتقليد الافتراضي التراجع عن ALERTVIEW ، استخدم redoMenuItemTitle
و undoMenuItemTitle
للحصول على عنوان الزر ، ثم استخدم canUndo
و canRedo
لتقرير ما إذا كان سيتم عرض زر أم لا.
يحرر: إليك الرمز من طلبي:
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
if (event.type == UIEventTypeMotion && event.subtype == UIEventSubtypeMotionShake) {
//textUndoManager is an ivar but it was just a reference to the undoManager
//textUndoManager = [myTextView undoManager]; <--- in viewDidLoad:
NSString *undoButtonTitle = nil;
NSString *redodoButtonTitle = nil;
NSString *alertViewTitle = nil;
if ([textUndoManager canUndo])
undoButtonTitle = [NSString stringWithString:[textUndoManager undoMenuItemTitle]];
if ([textUndoManager canRedo])
redodoButtonTitle = [NSString stringWithString:[textUndoManager redoMenuItemTitle]];
if (!undoButtonTitle && !redodoButtonTitle)
alertViewTitle = @"Nothing to Undo";
UIAlertView *alertView;
if (undoButtonTitle == nil) {
alertView = [[UIAlertView alloc] initWithTitle:alertViewTitle message:nil delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:redodoButtonTitle, nil];
} else {
alertView = [[UIAlertView alloc] initWithTitle:alertViewTitle message:nil delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:undoButtonTitle, redodoButtonTitle, nil];
}
[alertView show];
}
}
//UIAlertViewDelegate
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
if ([[alertView buttonTitleAtIndex:buttonIndex] isEqualToString:[textUndoManager undoMenuItemTitle]]) {
[textUndoManager undo];
}
if ([[alertView buttonTitleAtIndex:buttonIndex] isEqualToString:[textUndoManager redoMenuItemTitle]]) {
[textUndoManager redo];
}
}