2009-05-23 15 views
7

कोको बाइंडिंग में मुझे हमेशा एक समस्या है जो त्रुटि प्रस्तुति हुई है, उदाहरण के लिए जब उपयोगकर्ता एक फॉर्मेटर के साथ टेक्स्ट फ़ील्ड में गलत मान टाइप करता है। आम तौर पर मैं उत्तरदाता श्रृंखला में कहीं willPresentError: ओवरराइड करता हूं, लेकिन मेरी समस्या यह है कि बाइंडिंग सिस्टम द्वारा बनाई गई एनएसईआरआरआर ऑब्जेक्ट्स में मेरे लिए पर्याप्त जानकारी नहीं है कि क्या असफल रहा है, या यदि यह भी एक त्रुटि है, तो मुझे अनुकूलन में दिलचस्पी है। मैं समीकरण से बाइंडिंग को पूरी तरह से हटा सकता हूं और सत्यापन की समस्या होने पर अपनी त्रुटियों को बना सकता हूं, लेकिन मुझे लगता है कि मैं इस तरह से कुछ उपयोगी चीजें फेंक रहा हूं।बाइंडिंग शामिल होने पर मैं एनएसईआरआर प्रस्तुति को ओवरराइड कैसे करूं?

मैं एनएससींट्रोल प्रतिनिधि विधियों को लागू करके और मेरे नियंत्रण नियंत्रक में एक इंस्टेंस चर में विफल नियंत्रण को संग्रहीत करके इसे प्राप्त करने में सक्षम हूं। यदि willPresentError: समय के आधार पर यह गैर-शून्य है, तो मुझे पता है कि मान्य करने में क्या असफल रहा।

- (BOOL)control:(NSControl *)control didFailToFormatString:(NSString *)string errorDescription:(NSString *)error; 
{ 
    _errorSender = [control retain]; 
    return NO; 
} 

- (NSError *)willPresentError:(NSError *)error; 
{ 
    if (_errorSender != nil) 
    { 
     NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithDictionary:[error userInfo]]; 
     NSString *help = NSLocalizedString(@"Why are you always messing up? You are a terrible person.", @""); 

     [_errorSender release]; 
     _errorSender = nil; 
     [userInfo setObject:help forKey:NSLocalizedRecoverySuggestionErrorKey]; 

     return [NSError errorWithDomain:[error domain] code:[error code] userInfo:userInfo]; 
    } 

    return [super willPresentError:error]; 
} 

यह काम करता है जब पहला जवाब बदलावों, लेकिन जब मैं दृश्य नियंत्रक पर commitEditing फोन है, तो यह मेरे लिए केवल आंशिक रूप से उपयोगी है नहीं।

एकमात्र अन्य विकल्प जो मैं देख सकता हूं, समीकरण के बाहर NSFormatter ले रहा है, और मेरे कोर डेटा प्रबंधित ऑब्जेक्ट्स में सत्यापन को संभालने के लिए validateValue:forKey:error: का उपयोग कर रहा है। यह एक फॉर्मेटर का उपयोग करने के रूप में मेरे लिए ज्यादा समझ में नहीं आता है, लेकिन कम से कम मैं एनएसईआरआर ऑब्जेक्ट पर पूर्ण नियंत्रण रखूंगा।

मुझे लगता है कि त्रुटि प्रबंधन के साथ इस तरह के डिस्कनेक्ट होने के लिए मुझे कुछ याद आना चाहिए। कोई सुझाव?

उत्तर

4

I could completely remove bindings from the equation and create my own errors when validation problems occur, but I feel like I would be throwing out some useful stuff that way.

आप NSUnderlyingErrorKey उपयोग कर सकते हैं एक और गलती से एक त्रुटि (उस कुंजी के लिए वस्तु) रैप करने के लिए (जिसका userInfo कि कुंजी है)।

The only other option I can see is taking NSFormatter out of the equation, and using validateValue:forKey:error: in my Core Data managed objects to handle validation. This doesn't make as much sense to me as using a formatter, but at least I'd have full control over the NSError object.

ये दो अलग-अलग स्तर हैं, और वे परस्पर अनन्य नहीं हैं। फॉर्मेट सत्यापन दृश्य परत पर है; कुंजी-मान सत्यापन (इस मामले में, आपके प्रबंधित ऑब्जेक्ट्स में) मॉडल परत पर है।

यदि प्रश्न में सत्यापन दृश्य परत पर होना चाहिए, तो अपने NSFormatter क्लास को उप-वर्गीकृत करें (यदि आपने पहले से नहीं किया है) और अधिक विशिष्ट त्रुटि विवरण लौटने के लिए getObjectValue:forString:errorDescription: लागू करें। अपने NSManagedObject उपवर्ग में (मैं पता नहीं है कि क्या वास्तव में बाइंडिंग, इस त्रुटि विवरण का उपयोग करता है, हालांकि है। आप की जाँच करनी चाहिए।)

सत्यापन मॉडल परत पर होना चाहिए, तो validate<Key>:error: (validateValue:forKey:error: की एकल संपत्ति संस्करण) को लागू।

यदि कुछ बाधाएं मॉडल परत पर हैं और अन्य दृश्य परत पर हैं, तो दोनों करें। आप मॉडल में फॉर्मेटर और अन्य चेक में कुछ चेक लागू करने के लिए स्वतंत्र हैं, अगर यह आपके ऐप और आपके चेक के लिए समझ में आता है।

+1

मैं NSFormatter subclassing कर रहा हूँ, और बाइंडिंग एनएसएसटींग त्रुटि संदेश का उपयोग करता है, मैं अंतिम एनएसएएलर्ट अभी भी बहुत ही नंगे हड्डियों को प्रदान करता हूं (मैं कम से कम त्रुटि पर एक रिकवरी सुझाव जोड़ना चाहता हूं)। मैं जो सत्यापन कर रहा हूं वह ऐसा लगता है कि यह मेरे NSFormatter उप-वर्गों के लिए बेहतर है, इसलिए मैं अपने मॉडल पर कुंजी-मान सत्यापन लागू करने में संकोच नहीं कर रहा हूं। मैं सभी प्रकार के स्ट्रिंग पार्सिंग को समाप्त कर दूंगा जिसमें डेटा मॉडल के साथ कुछ लेना देना नहीं है, बस कुछ गलत होने पर फ्रंट एंड त्रुटि संदेश को कस्टमाइज़ करने में सक्षम होना चाहिए। –