मैं एक ऐसी ही स्थिति है जहाँ मैं (जबकि अभी भी पूर्ववत/अन्य कार्यों के लिए फिर से करना अनुमति) सशर्त कुछ पूर्ववत करें/फिर संचालन निष्क्रिय करने के लिए जब एप्लिकेशन विशिष्ट स्थिति में है चाहती थी।
एक दृश्य पर - (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
सुनिश्चित नहीं हैं कि अगर कोई ऐसा करने के साथ किसी भी मुद्दे (मैं किसी भी नोटिस नहीं किया था) कर रहे हैं, लेकिन यह चेतावनी को खत्म करता है। मैंने कक्षा को स्विफ्ट क्लास में बदल दिया है, जिसके साथ निपटने के लिए कोई चेतावनी नहीं थी।
हाँ। उसने ऐसा किया लागू करना था (IBAction) पूर्ववत: (आईडी) प्रेषक हालांकि। – Sebastian