2012-04-27 9 views
6

के लिए विंडो शीर्षक में "संपादित" ओवरराइड करना मैं एक एनएसडी दस्तावेज़ के लिए "संपादित" प्रदर्शित करने से विंडो शीर्षक को कैसे रोकूं जो गंदा है?NSDocument

मैं वेब सेवा का उपयोग करके स्वयं को सहेजने और स्वत: सहेजने का प्रबंधन कर रहा हूं, और सिर्फ शीर्षक पट्टी में व्याकुलता नहीं चाहता हूं।

मैं कोशिश की है अधिभावी:

  • NSDocument के -isDocumentEdited और -hasUnautosavedChanges हमेशा NO वापस जाने के लिए। पैरामीटर के वास्तविक मूल्य के बावजूद
  • -[NSWindowController setDocumentEdited] कुछ भी करने के लिए, या हमेशा NO का उपयोग करने के लिए।
  • -[NSWindowController synchronizeWindowTitleWithDocumentName] कुछ भी करने के लिए नहीं। पैरामीटर के वास्तविक मूल्य के बावजूद
  • -[NSWindow setDocumentEdited] कुछ भी करने के लिए, या हमेशा NO का उपयोग करने के लिए।

सभी मामलों में, जब मैं सहेजे गए दस्तावेज़ में परिवर्तन करता हूं तो टाइटल बार अभी भी संपादित में बदल जाता है।

यदि मैं कुछ भी करने के लिए -[NSDocument updateChangeCount:] और -[NSDocument updateChangeCountWithToken:forSaveOperation:] ओवरराइड करता हूं, तो मैं इसे होने से रोक सकता हूं, लेकिन यह बचत, स्वत: सहेजने और अन्य दस्तावेज़ व्यवहार को भी प्रभावित करता है।

मैं भी करने की कोशिश की इस:

[[self.window standardWindowButton: NSWindowDocumentVersionsButton] setTitle:nil]; 

कि संपादित करने के बजाय एक खाली स्ट्रिंग दिखाया गया है, लेकिन पानी का छींटा अभी भी दिखाई दिया - एक जो आम तौर पर दस्तावेज़ नाम और संपादित अलग करती है।

किसी भी विचार से दस्तावेज़ से खिड़की के इस हिस्से को अलग करना कैसे?

उत्तर

6

कई विकल्प:

  1. , "पानी का छींटा" करने के लिए एक सूचक प्राप्त करने के लिए एक stringValue साथ [window.contentView.superview.subviews] में एक TextField देखने के बराबर होती है करने के लिए "-"। आप अपना टेक्स्ट एक खाली स्ट्रिंग पर भी सेट कर सकते हैं।

    @implementation NSWindow (DashRetrivalMethod) 
    - (NSTextField*)versionsDashTextField 
    { 
        NSTextField* res = nil; 
        NSView* themeFrame = [self.contentView superview]; 
        for (NSView* tmp in [themeFrame subviews]) 
        { 
         if ([tmp isKindOfClass:[NSTextField class]]) 
         { 
          if ([[(NSTextField*)tmp stringValue] isEqualToString:@"—"]) 
          { 
            res = (NSTextField*)tmp; 
            break; 
          } 
         } 
        } 
        return res; 
    } 
    @end 
    
  2. आप NSWindow's -setRepresentedURL को ओवरराइड कर सकते हैं:। यह NSWindowDocumentIconButton और पॉपअप मेनू को भी प्रभावित करेगा, लेकिन यदि आप चाहें तो मैन्युअल रूप से इसे बना सकते हैं: [NSWindow standardWindowButton: NSWindowDocumentIconButton]।

  3. अवहेलना इन तीन NSDocument के गैर-दस्तावेजी तरीकों में से एक:

    // Always return here NO if you don't want the version button to appear. 
    // This seems to be the cleanest options, besides the fact that you are 
    /// overriding a private method. 
    - (BOOL)_shouldShowAutosaveButtonForWindow:(NSWindow*)window; 
    
    // Call super with NO 
    - (void)_setShowAutosaveButton:(BOOL)flag; 
    
    // Here the button and the dash are actually created 
    - (void)_endVersionsButtonUpdates; 
    
    // Here Cocoa hide or unhide the edited button 
    - (void)_updateDocumentEditedAndAnimate:(BOOL)flag 
    
+0

धन्यवाद आदमी Google पर खोजना मुश्किल था। – thamster

+0

उत्कृष्ट समाधान। @ नोआ आपको इसे स्वीकार करना चाहिए। यह विस्मयकारी है। बीटीडब्ल्यू बेन-उरी, ओवरराइड से आप का मतलब सही है? – Noitidart

+0

धन्यवाद। कोई तेज नहीं प्रत्येक विधि प्रोटोटाइप के ऊपर टिप्पणी में सुझाए गए अनुसार बस उन्हें अपने एनएसडी दस्तावेज़ सबक्लास में लागू करें। –

1

क्या आपने - (BOOL) isDocumentEdited ओवरराइड करने के अलावा NSDocuments - (BOOL)hasUnautosavedChanges ओवरराइड करने का प्रयास किया है?

+0

यह एक अच्छा विचार है। ऑटोसविंग के बाद, हालांकि, तब तक संपादित होता है जब तक उपयोगकर्ता स्पष्ट रूप से ऐप्पल के डिज़ाइन द्वारा सेव ऑपरेशन शुरू नहीं करता है। उस ने कहा, मैंने वैसे भी इसका परीक्षण किया: दोनों 'हसउनॉटोस्ड चेंज' और '-isDocumentEdited' रिटर्न नहीं, वैसे भी संपादित किया गया। – paulmelnikow

+0

ठीक है, यह दुर्भाग्य से मेरा एकमात्र विचार था। मुझे लगता है कि आवेदन के आधार पर एनएसडी दस्तावेज़ को छोड़कर, और केवल NSDocumentController का उपयोग करने के लिए, आपके आवेदन की एक बड़ी पुनर्लेख की आवश्यकता होगी? – thundersteele

+0

यह सही है। '-अपडेट चेंजकाउंट:', '-उपडेट चेंज काउंटरफॉरटोकन: के लिए सेवऑपरेशन:', '-इस डॉक्यूमेंट एडिट' और '-हासउनॉटोस्ड चेंज' संभव हो सकता है, लेकिन यह भी कठोर लगता है, और संभावित रूप से बनाए रखना मुश्किल है। दस्तावेज़ को अपनी खिड़की के बारे में नहीं बता रहा एक और संभावना है, लेकिन फिर, कठोर। – paulmelnikow

0

यद्यपि यह एक देर से जवाब है, आप आसानी से तय कर सकते हैं कि आपके NSDocument विंडो के टाइटल होने जा रहा है

अधिभावी द्वारा
- (NSString *)windowTitleForDocumentDisplayName:(NSString *)displayName 

आपके NSWindowController में और उचित शीर्षक लौटाएं।

आप अपने NSDocument की संपत्ति अधिभावी द्वारा भी कर सकते हैं:

- (NSString *)displayName 

लेकिन इस नहीं एप्पल द्वारा की सिफारिश की है, क्योंकि है कि सामान्य रूप ओएस त्रुटि संचालकों द्वारा प्रयोग किया जाता है।

मैंने यह उत्तर जोड़ा, क्योंकि अन्य उत्तरों में से कोई भी वास्तव में मुझे सही रास्ते पर सेट नहीं करता है।

संबंधित मुद्दे