2012-04-16 13 views
41

व्यू कंट्रोलर में, वीसी लोड होने पर जानने के लिए ViewDidLoad है।आईओवी व्यूडिडलोड UIView

एक UIView के लिए, दृश्य लोड होने पर मुझे किस विधि का उपयोग करना होगा?

क्या इस विधि को किसी भी init के साथ बुलाया जाएगा?

संपादित करें: कोई XIB, केवल प्रोग्रामेटिक रूप से नहीं।

+0

जहां आप इसे से लोड पर निर्भर करता है ... – borrrden

+0

हाय धन्यवाद, मैं दृश्य से दृश्य लोड कर रहा हूं नियंत्रक – MaKo

उत्तर

-6

यह इस तरह काफी काम नहीं करता है।

- (void)viewDidLoad दृश्य नियंत्रक लोड होने पर नहीं कहा जाता है; इसे तब देखा जाता है जब दृश्य नियंत्रक का दृश्य लोड होता है।

तो आप UIViewController बना सकते हैं, और केवल उन्हीं विधियों को बुलाया जाएगा जो इसे प्रारंभ करने के लिए उपयोग की जाने वाली इनिट विधियां हैं। दृश्य नहीं बनाया जाएगा, - (शून्य) viewDidLoad विधि कहा जाता है, आदि

फिर

जब कुछ और, अपने दृश्य के लिए दृश्य नियंत्रक पूछता है के माध्यम से:

viewController.view; 

दृश्य नियंत्रक तो कॉल :

- (void)loadView; // This is where you put your own loading view information, and set the viewController's self.view property here. 

इसके बाद:

- (void)viewDidLoad; 

देखें क्या लोड एक अलग तरीका है ताकि आप नहीं है वास्तविक लोड व्यू विधि, और जटिल दृश्य लोडिंग विकल्पों को बाधित करना होगा। Nibs आदि का उपयोग करते समय loadView विधि को उप-वर्गीकरण और ओवरराइड करने से समस्याएं हो सकती हैं जब डेवलपर्स सुनिश्चित नहीं हैं कि ऐप्पल क्या कर रहा है और उनके सर्वोत्तम अभ्यास क्या हैं, इसलिए ऐप्पल को विधि को अलग करने के लिए यह स्मार्ट था।

तब, जब एक स्मृति चेतावनी आता है दृश्य जारी की है, और सेट नहीं के बराबर करने के लिए:

- (void)viewWillUnload; 
// view unloaded and set to nil. 
- (void)viewDidUnload; 
+54

यह यह है कि यह uiviewcontroller में कैसे काम करता है UIView ... – ngb

+3

यह उत्तर बिल्कुल प्रश्न के बिंदु को प्रतिबिंबित नहीं करता है ... पूछताछकर्ता कोई दृश्य नियंत्रक नहीं चाहता है। –

+1

सही उत्तर यहां है http://stackoverflow.com/a/4502761/2757496 – kaushal

30

यदि आप इसे XIB फ़ाइल से लोड करते हैं, तो जागरूक FromNib विधि को XIB से लोड होने पर बुलाया जाएगा।

संपादित कोई XIB के मामले में, आप शायद यह the docs की अवलोकन देखें-संबंधी परिवर्तनों क्षेत्र से तरीकों में से एक (उदाहरण के लिए, didMoveToSuperview) का उपयोग कर अनुमान लगाने के लिए होगा। हालांकि, दृश्यदर्शी दृश्य दृश्य में दृश्य नियंत्रक से अपने विचारों को संदेश भेजने का एक बेहतर तरीका है।

+0

हाय धन्यवाद मेरे प्रश्न को संपादित करेगा, कोई XIB, ju सेंट प्रोग्रामेटिक – MaKo

+0

उत्कृष्ट उत्तर, बिल्कुल सही! – myusuf3

+0

यदि UIView को पुनः लोड किया गया है तो क्या यह फिर से आग लगती है? – dumbledad

0

जहाँ तक मुझे पता है, मैं वहाँ init के अलावा इस तरह के एक विधि नहीं लगता। आमतौर पर मैं इनिट विधि में तैयारी करता हूं। आप अपना खुद का viewDidLoad विधि बना सकते हैं और इसे मैन्युअल रूप से कॉल कर सकते हैं। लेकिन अधिकांश समय, UIView को इसके व्यू कंट्रोलर द्वारा प्रबंधित किया जाता है, ताकि दृश्य को लोड करने के दौरान नियंत्रक को पता होना चाहिए कि दृश्य को कॉन्फ़िगर करना चाहते हैं, तो आप इसे व्यू कंट्रोलर में कर सकते हैं। वैसे, viewDidLoad विधि हमेशा नहीं कहा जाता है।

+5

मैंने कभी भी 'viewDidLoad' * नहीं * देखा है। किस परिस्थिति में इसे नहीं कहा जाएगा? – devios1

2

मुझे इसी तरह की समस्या थी और सापेक्ष आसान समाधान मिला। आइडिया सही समय पर प्रत्येक बच्चे के दृश्य में viewDidLoad भेजना है और अपनी रुचि के वर्ग पर उस विधि को अधिभारित करना है।

ऐसा करने के लिए कोड के इस भाग को अपनी कक्षाओं में जोड़ें ...

// UIViewController 
- (void)viewDidLoad 
{ 

    [super viewDidLoad]; 

    [self.view viewDidLoad]; 
} 


// UIView+Loading.m 
#import < UIKit/UIKit.h> 

@implementation UIView (Loading) 

- (void)viewDidLoad 
{ 

    for (UIView* subview in self.subviews) 

     [subview viewDidLoad]; 
} 

@end 


// UIView+Loading.h 
#import < UIKit/UIKit.h> 

@interface UIView (Loading) 

- (void)viewDidLoad; 

@end 


// UIView_CustomImplementation 

- (void)viewDidLoad 
{ 

    NSLog(@"Do whatever you want to do in custom UIView after method viewDidLoad on UIViewController was called"); 

} 
7

वास्तव में, आप दृश्य नियंत्रक की विधि viewDidLoad(), अपने दृश्य के प्रारंभ के लिए के साथ कुछ भी करने को नहीं है। आप जो कुछ करना चाहते हैं, आप दृश्य की init विधि में कर सकते हैं। उदाहरण के लिए, दृश्य नियंत्रक के viewDidLoad() में, वहाँ कुछ प्रवर्तन कोड है:

- (void)viewDidLoad{ 
    [super viewDidLoad]; 

    // init your parameters here 
} 

Analogously, अपने दृश्य के init विधि में:

- (id)initWithDelegate:(id)_delegate 
{ 
    self = [[[[NSBundle mainBundle] loadNibNamed:@"YourView" owner:self options:nil] objectAtIndex:0] retain]; 
    if (self) { 
     [super init]; 

     self.delegate = _delegate; 

     // init your parameters here 

     return self; 

    } 
    return nil; 
} 

उसके बाद, आप YourView इस तरह दृश्य नियंत्रक से बनाने के लिए:

YourView view = [[YourView alloc] initWithDelegate:self]; 
[self.view addSubview:view]; 
[view release]; 

इसके अलावा, चीजें हैं जो आप इस तरह, आपके विचार में क्या करना है जब आपके विचार लोड किया था, आप layoutSubviews विधि में जगह कर सकते हैं चाहता हूँ:

-(void)layoutSubviews{ 
    [super layoutSubviews]; 

    // init your parameters here, like set up fonts, colors, etc... 
} 

मुझे लगता है, आपको यही चाहिए।

चीयर्स!

4

स्विफ्ट 2:

import UIKit 

class myView: UIView { 

    override func layoutSubviews() { 
    print("run when UIView appears on screen") 
    // you can update your label's text or etc. 
    } 
} 
+1

स्विफ्ट 2 के साथ इसका कोई लेना-देना नहीं है। यह बाधा आधारित लेआउट के लिए ओवरराइड पॉइंट है। फ्रेमवर्क में टिप्पणी का हवाला देते हुए: "लेआउट द्वारा बुलाया गया ओवरराइड पॉइंट। स्वचालित रूप से परिभाषित किया गया है। आईओएस 6.0 के रूप में, जब बाधाओं-आधारित लेआउट का उपयोग किया जाता है तो आधार कार्यान्वयन बाधाओं-आधारित लेआउट को लागू करता है, अन्यथा यह कुछ भी नहीं करता है।" –

+2

चेतावनी: लेआउटसब्यूव्यू कई बार आग लग सकता है और निश्चित रूप से कोई सेटअप कोड करने की जगह नहीं है (जैसे viewDidLoad) –

1

आप उपयोग कर सकते हैं willMove (toSuperview newSuperview: UIView)

import UIKit 

final class myView: UIView { 

    override func willMove(toSuperview newSuperview: UIView?) { 
    //Do stuff here 
    } 
} 

Apple Docs