2015-07-09 9 views
5

मेरा वर्तमान प्रोजेक्ट आईओएस 7+ का समर्थन करता है और मेरे दृश्य नियंत्रकों में से एक में मैं UIAlertView और UIAlertController दोनों का उपयोग करने की कोशिश कर रहा हूं।कक्षा चर पर उपलब्धता जांच कैसे करें

मेरे पास # विधियां सशर्त काम हैं जो मेरी विधियों में काम कर रही हैं, लेकिन मुझे यकीन नहीं है कि वर्रों को कैसे लपेटें।

जब मैं है:

var alertController: UIAlertController! 
var alertView: UIAlertView! 

मैं एक त्रुटि मुझे बता संदेश मिलता है UIAlertController आईओएस में ही उपलब्ध है 8 और "वर्ग संलग्न करने के लिए @available जोड़ना" द्वारा 'यह ठीक' करने का विकल्प। हालांकि मुझे लगता है कि यह पूरी कक्षा को चिह्नित करता है, और यह वही नहीं है जो मैं चाहता हूं।

+1

आपको पूर्ण वर्ग का उपयोग करना होगा, क्योंकि कक्षा के अंदर किसी भी चीज़ के पास इस संपत्ति तक पहुंच है, आपको अपनी कक्षा – Kametrixom

+0

के भीतर विभिन्न उप-वर्गों या शायद अलग-अलग कक्षाओं की आवश्यकता हो सकती है, ठीक है, जो वास्तव में बहुत समझ में आता है। यह सुनिश्चित नहीं है कि इन पर पहुंच के बिना इन पर परीक्षण कवरेज कैसे प्राप्त करें। शायद इसे अभी छोड़ना होगा। धन्यवाद। –

+3

यह वह जगह है जहां आपको वस्तु उन्मुख प्रोग्रामिंग की विरासत और अमूर्त क्षमताओं का उपयोग करना चाहिए। आपको UIAlertView या UIAlertController का खुलासा नहीं करना चाहिए - आपकी कक्षा को क्लास कार्यान्वयन – Paulw11

उत्तर

16

मैं सिर्फ इस मुद्दे में आए और मेरा भी एक समाधान खोजने के लिए संघर्ष किया है तो समाप्त हो गया चर आलसी बनाने और उपलब्धता एनोटेशन

जोड़ने अपने कार्यान्वयन के रूप में दिखाई देगा, जबकि शून्य करने के लिए दोषी इस प्रकार है:

@available(iOS 8.0, *) 
lazy var alertController: UIAlertController? = { return nil }() 

तो फिर तुम कोशिश करते हैं और पहुँच है कि संपत्ति संकलक सुनिश्चित करेंगे जब भी अपनी एक उपलब्धता की जांच में पहरा ताकि आप कभी भी है:

if #available(iOS 8.0, *) { 
    self.alertController = ... 
} else 
    self.alertView = ... 
} 
+0

बहुत बढ़िया उत्तर और बहुत कुछ जो मैं बाद में था। धन्यवाद। –

+0

xcode 9 बीटा 3 पर भी काम करता है :) –

1

यदि आपको केवल एक फ़ंक्शन में अलर्ट का उपयोग करने की आवश्यकता है, तो आप बस अपना कोड func ब्लॉक में ले जा सकते हैं और एक्सकोड 7 सुझाव के साथ आ जाएगा।

क्या होगा यदि आपको कई func ब्लॉक में अलर्ट का उपयोग करने की आवश्यकता है और उसी चेतावनी ऑब्जेक्ट को ओवर-ओवर का संदर्भ लें?

आप एक नए यूआईआरस्पेन्डर का उपयोग कर सकते हैं और इसे उपलब्धता के आधार पर UIAlertController या UIView पर डाउनकास्ट कर सकते हैं। मैंने अपनी परियोजना में इसका परीक्षण नहीं किया है, लेकिन इसे काम करना चाहिए।

let alertContainer: UIResponder? 

init() { 
    if #available(iOS 8.0, *) { 
     let alertController: UIAlertController! 
     alertContainer = alertController 
    } else { 
     let alertView: UIAlertView! 
     alertContainer = alertView 
    } 
} 

func someFunction() { 
    if #available(iOS 8.0, *) { 
     var alertController = alertContainer as! UIAlertController 
     // use the alertController 
    } else { 
     var alertView = alertContainer as! UIAlertView 
     // use the UIAlertView 
    } 
} 

यह वास्तव में अधिक कोड जोड़ता है, लेकिन यह एक्सकोड की जांच पास करता है। यदि आप एक बेहतर समाधान के साथ आते हैं, तो कृपया मुझे बताएं।

+0

डेनियल जवाब देखें। जो कुछ आपने प्रस्तुत किया है वह भी एक अच्छा समाधान है जब सब कुछ अलग रखना चाहते हैं। –

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