2015-02-05 7 views
12

मैं कैसे किसी अन्य वर्ग से एक कक्षा में एक @IBOutlet घोषित उपयोग करने के लिए जानना चाहता हूँ से एक IBOutlet तक कैसे पहुंचेंअन्य वर्ग

उदाहरण के लिए, मैं एक वर्ग नामित myfirstview

class MyFirstView: UIViewController { 

    @IBOutlet var lblred: UILabel! = UILabel() 
} 

मैं चाहता है

class MySecondView: UIViewController { 

    func modify() { 
     let mfv = MyFirstView() 
     mfv.lblred.text = "Hello" 
    } 
} 

लेकिन कुछ भी नहीं happe: MySecondView नामक एक अन्य वर्ग जो एक और .swift फ़ाइल में लिखा है से lblred के पाठ को बदलने के लिए एनएस।
मैंने स्टोरीबोर्ड लेबल के साथ lblred को जोड़ा है। मैंने वेब पर इस बारे में बहुत कुछ खोजा है लेकिन मुझे वह समस्या नहीं मिल सकती जो मेरी समस्या का समाधान कर सके। कृपया इस समस्या को हल करने में मेरी मदद करें।

धन्यवाद।

+0

कृपया स्वरूपित कोड –

उत्तर

4

समस्या यहाँ है:

var lblred : UILabel! = UILabel() 

आप कोई नया लेबल यहाँ का निर्माण। यह आपके आईबीओलेट कनेक्शन को तोड़ रहा है। आपको केवल

@IBOutlet var lblred : UILabel! 
+0

@cjwirth, धन्यवाद –

+1

जब मैं उस, परिणाम यह दिखाते हैं: गंभीर त्रुटि: अप्रत्याशित रूप से नहीं के बराबर है जबकि एक वैकल्पिक मूल्य –

+0

unwrapping यह त्रुटि IBOutlet कोई वैकल्पिक प्रकार UILabel है कि पता चलता पाया। हालांकि, –

0

किसी अन्य वर्ग से आईबीओलेट को कॉल करने का अनुशंसित तरीका नहीं है। यदि आप आईबीओलेट को कॉल करना या एक्सेस करना चाहते हैं तो आपको इसे संपत्ति के रूप में सेट करना चाहिए और फिर इसे एक्सेस करना चाहिए।

उदाहरण के लिए:

//ViewControler.h 

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController 

@property (weak, nonatomic) IBOutlet UILabel *label; 

@end 

//abc.m 

#import <UIKit/UIKit.h> 
#import <ViewController.h> 

@interface abc 

@end 

@implementation abc 

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
ViewController *viewCOntroller= [ViewController alloc] init]; 
viewCOntroller.label.text = @"Hello"; 
} 
13

@Sheen अपने तत्काल समस्या के बारे में सही है, लेकिन आपकी समस्या गहरा है। किसी वस्तु को किसी अन्य ऑब्जेक्ट के IBOutlets तक पहुंच नहीं लेनी चाहिए। यह अच्छी तरह परिभाषित नहीं है कि क्या होगा। यह ओबीजेसी कोड में बग का एक लंबा स्रोत रहा है, और स्विफ्ट उन सामान्य बग को क्रैश में बढ़ा देता है।

आईबीओटलेट्स को तब तक असाइन नहीं किया जाता जब तक कि दृश्य लोड नहीं हो जाता। इसका मतलब यह है कि यदि दृश्य नियंत्रक आवंटित किया गया है लेकिन अभी तक स्क्रीन पर नहीं रखा गया है, तो आईबीओटलेट अभी भी शून्य हैं। एक निस्संदेह अनचाहे नील तक पहुंचने से स्विफ्ट दुर्घटनाग्रस्त हो जाएगा।

देखें नियंत्रकों को केवल अपने बच्चों के नियंत्रकों के साथ संवाद करना चाहिए। उन्हें सिस्टम में मनमानी दृश्य नियंत्रकों के साथ संवाद नहीं करना चाहिए। मनमानी दृश्य नियंत्रकों के बीच संचार मॉडल के माध्यम से किया जाता है। एक व्यू कंट्रोलर मॉडल को अपडेट करता है, और एक और व्यू कंट्रोलर मॉडल से पढ़ता है। यह Model-View-Controller पैटर्न है जो कोको के अधिकांश के आसपास बनाया गया है।

देखें नियंत्रक अपने बच्चों के साथ सीधे बातचीत कर सकते हैं, लेकिन फिर भी आईबीओटलेट को सीधे संशोधित नहीं करना चाहिए। उन्हें गुण निर्धारित करना चाहिए। यह सही डेटा पर उस डेटा को उस लेबल से सही समय पर ले जाने के लिए बाल दृश्य नियंत्रक की ज़िम्मेदारी है (जिसे viewDidLoad() तक प्रतीक्षा करनी पड़ सकती है)। यही कारण है कि इसे "व्यू कंट्रोलर" कहा जाता है। यह एक विचार है जो इसके विचारों के लिए जिम्मेदार है। उनके साथ किसी और को गड़बड़ नहीं करनी चाहिए।

+0

, आप सही हैं। धन्यवाद। –

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