يهتز الكشف عن الإيماءات في فئة Uiwindow الفرعية الاستحواذ على النص الافتراضي التراجع عن المدير

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

  •  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];
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top