2013-02-25 64 views
5

मैं क्रियान्वित किया है पूर्ववत/मानक तरीका (NSUndoManager) फिर से करना है, लेकिन समझ नहीं कैसे मैं पूर्ववत/redos जब मेरे एप्लिकेशन विशिष्ट स्थिति में है अक्षम करें।अक्षम कोको अनुप्रयोग में पूर्ववत/फिर से

उपयोगकर्ता मेरे ऐप में चीजें खींचते हैं और जब उन्होंने जो खींचा है वह अपलोड कर रहा है तो मैं यूआई को अक्षम करता हूं और निश्चित रूप से नहीं चाहता कि उपयोगकर्ता पूर्ववत/फिर से करने में सक्षम हो।

मैं एक NSView के पूर्ववत प्रबंधक उपयोग करती हैं इसलिए मुझे लगता है कि एक तरह से सिर्फ इतना है कि दृश्य को इस्तीफा देने के पहले प्रत्युत्तर बनाने के लिए हो सकता है। क्या कोई और तरीका है?

उत्तर

1

आप पूर्ववत को अंतिम रूप देने और

साथ फिर से करना कर सकते हैं

- (void) removeAllActionsWithTarget: (id) target; 

आप बस एक बार के लिए किसी भी कार्रवाई को निष्क्रिय करने के लिए, पूर्ववत करें ढेर अपरिवर्तित छोड़ चाहते हैं के साथ एक विशेष लक्ष्य के लिए

- (void) removeAllActions; 

करने या निकालने के कार्यों के लिए, बस टी को निष्क्रिय वह पूर्ववत करें/NSMenuValidationProtocol के

- (BOOL)validateMenuItem:(NSMenuItem *)menuItem; 
+0

हाँ। उसने ऐसा किया लागू करना था (IBAction) पूर्ववत: (आईडी) प्रेषक हालांकि। – Sebastian

-1

सबसे अच्छा तरीका जो मैं सोच सकता हूं, अपलोड के दौरान दृश्य -undoManager विधि वापसी शून्य बना रहा है, जो इसे प्रतिक्रियाकर्ता श्रृंखला से हटा देगा और उस दृश्य के लिए पूर्ववत/फिर से विकल्प अक्षम कर देगा।

(मैं इस परीक्षण नहीं किया है, लेकिन मैं 99% यकीन है कि मेनू जब भी यह मेनू विकल्पों की पुष्टि करता है पूर्ववत प्रबंधक के लिए अपने दृष्टिकोण को पूछना होगा हूँ।)

2

दृश्य पहले प्रत्युत्तर है का उपयोग कर मेनू आइटम फिर से करें, आप को अक्षम करने या अपने वर्तमान स्थिति के अनुसार मेनू आइटम को सक्षम करने के validateMenuItem: प्रोटोकॉल को लागू कर सकते हैं।

- (BOOL)validateMenuItem:(NSMenuItem *)menuItem { 
    SEL action = menuItem.action; 

    if (action == @selector(undo:) || 
     action == @selector(redo:)) { 
      return !uploadingImage; 
    } 
    return YES; 
} 
-1

प्रलेखन आपका मित्र है। NSUndoManager की disableUndoRegistration विधि अपने नाम में "अक्षम" है। यह तय करने के लिए आपके ऐप के नियंत्रकों पर निर्भर है कि यह पूर्ववत पंजीकरण को अक्षम और पुनः सक्षम करने के लिए उचित है।

+0

यह पूर्ववत घटनाओं की सेटिंग के बारे में है, पूर्ववत/फिर से मेनू को अक्षम करने के लिए नहीं। – martinjbaker

0

मैं एक ऐसी ही स्थिति है जहाँ मैं (जबकि अभी भी पूर्ववत/अन्य कार्यों के लिए फिर से करना अनुमति) सशर्त कुछ पूर्ववत करें/फिर संचालन निष्क्रिय करने के लिए जब एप्लिकेशन विशिष्ट स्थिति में है चाहती थी।

एक दृश्य पर - (BOOL)validateMenuItem:(NSMenuItem *)item को लागू करने की विधि मेरे लिए काम नहीं करती है (मेरे पास 10.12 पर एक दस्तावेज़-आधारित ऐप है)। https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/MenuList/Articles/EnablingMenuItems.html पर डॉक्स प्रति: या validateUserInterfaceItem: विधि

अगर कोई प्रत्युत्तर श्रृंखला है कि आइटम की कार्रवाई को लागू करता है में एक वस्तु है, NSMenu तो अगर उस वस्तु को लागू करता है validateMenuItem देखने के लिए जाँच करता है। यदि ऐसा नहीं होता है, तो मेनू आइटम सक्षम है। यदि ऐसा होता है, तो मेनू आइटम की सक्षम स्थिति विधि के वापसी मान द्वारा निर्धारित की जाती है।

दृश्य पूर्ववत विधि के साथ-साथ सही काम करता है जोड़ना होगा।

जब मैं प्रत्युत्तर श्रृंखला की जांच की, मैंने पाया कि मेरी NSWindow उद्देश्य यह है कि undo: के लिए प्रतिक्रिया व्यक्त था (हालांकि यह दस्तावेज इंटरफ़ेस का हिस्सा नहीं है), तो अपने वर्तमान प्लान validateMenuItem की imeplementation के साथ एक कस्टम NSWindow उपवर्ग उपयोग करने के लिए है , की तर्ज पर:

#import "Window.h" 

@implementation SBXWindow 

- (instancetype)initWithContentRect:(NSRect)contentRect styleMask:(NSWindowStyleMask)style backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag screen:(NSScreen *)screen 
{ 
    self = [super initWithContentRect:contentRect styleMask:style backing:bufferingType defer:flag screen:screen]; 

    return self; 
} 


- (BOOL)validateMenuItem:(NSMenuItem *)item 
{ 
    // Call super imeplementation as it appears to update the menu item title (and potentially other stuff) 
    BOOL result = [super validateMenuItem:item]; 
    if (result == NO) { 
     return NO; 
    } 

    if (item.action == @selector(undo:) || item.action == @selector(redo:)) { 
     // Add custom logic here 
    } 

    return result; 
} 

@end 

लेकिन वहाँ चेतावनी है कि undo:redo: तरीकों से लागू नहीं कर रहे हैं। ये इस तरह के रूप NSWindow पर एक वर्ग, बनाने के द्वारा समाप्त किया जा सकता:

@interface NSWindow (SBXUndoable) 

- (void)undo:(id)sender; 
- (void)redo:(id)sender; 

@end 

सुनिश्चित नहीं हैं कि अगर कोई ऐसा करने के साथ किसी भी मुद्दे (मैं किसी भी नोटिस नहीं किया था) कर रहे हैं, लेकिन यह चेतावनी को खत्म करता है। मैंने कक्षा को स्विफ्ट क्लास में बदल दिया है, जिसके साथ निपटने के लिए कोई चेतावनी नहीं थी।