iPhone SDK: loadView और viewDidLoad में क्या अंतर है?


136

IPhone ऐप में व्यू और व्यू कंट्रोलर के साथ काम करते समय, क्या कोई लोड व्यू और व्यूडीडलड के बीच अंतर बता सकता है?

मेरा व्यक्तिगत संदर्भ यह है कि मैं अपने सभी विचारों को कोड से बनाता हूं, मैं इंटरफ़ेस बिल्डर का उपयोग नहीं करूंगा और न ही करना चाहिए, इससे कोई फर्क नहीं पड़ता।

मैंने पाया है कि अक्सर जब मैं loadView में init कोड जोड़ता हूं, तो मैं एक अनंत स्टैक ट्रेस के साथ समाप्त होता हूं, इसलिए मैं आमतौर पर अपने सभी बच्चे-देखने की इमारत को viewDidLoad में करता हूं ... लेकिन यह वास्तव में मेरे लिए अस्पष्ट है जब प्रत्येक निष्पादित हो जाता है, और init कोड डालने के लिए अधिक उपयुक्त स्थान क्या है। क्या सही होगा, इनिशियलाइज़ेशन कॉल्स का एक सरल आरेख है।

धन्यवाद!

जवाबों:


200

मैं अनुमान लगा सकता हूं कि यहां क्या समस्या हो सकती है, क्योंकि मैंने इसे किया है:

मैंने पाया है कि अक्सर जब मैं loadView में init कोड जोड़ता हूं, तो मैं एक अनंत स्टैक ट्रेस के साथ समाप्त होता हूं

Self.view को -loadView में न पढ़ें। केवल इसे सेट करें , इसे प्राप्त न करें ।

यदि दृश्य वर्तमान में लोड नहीं किया गया है, तो self.view प्रॉपर्टी ऐक्सेसर-लोड व्यू को कॉल करता है। आपकी अनंत पुनरावृत्ति है।

Apple के पूर्व-इंटरफ़ेस-बिल्डर उदाहरणों में दिखाए गए प्रोग्राम को-लोड व्यू में प्रोग्राम बनाने का सामान्य तरीका, इस प्रकार है:

UIView *view = [[UIView alloc] init...];
...
[view addSubview:whatever];
[view addSubview:whatever2];
...
self.view = view;
[view release];

और मैं आपको आईबी का उपयोग न करने के लिए दोषी नहीं ठहराता। मैं सभी इंस्टैपर के लिए इस विधि के साथ फंस गया हूं और आईबी की जटिलताओं, इंटरफेस क्वर्क, और अप्रत्याशित बैक-द-बिहाइंड व्यवहार से निपटने के बजाय अपने आप को इसके साथ अधिक आरामदायक पाता हूं।


आह, एक स्पष्टीकरण के लिए धन्यवाद, आखिरकार! मैंने एक अस्थायी चर आवंटित करने के मुहावरे से किनारा कर लिया है, फिर स्वयं को स्थापित करना है। फिर, जारी करना ... यह किसी भी तरह अजीब, अनावश्यक लग रहा था। मैं अब समझ सकता हूं कि उस फैसले ने मुझे उस रास्ते पर ले जाया होगा जहां अब मैं खुद को पाता हूं।
ryan.scott

मेरे पास ऐसा कोड है और कोई पुनरावृत्ति नहीं है। क्यों? -(void) loadView { // Frame for Hypnosis view CGRect frame = [[UIScreen mainScreen] bounds]; // Create a Hipnosis view v = [[HypnosisView alloc] initWithFrame:frame]; self.view = v;
user2054339

44

loadViewइसमें वह विधि है UIViewControllerजो वास्तव में दृश्य को लोड करेगी और इसे viewसंपत्ति को सौंपेगी। यह वह स्थान भी है जहाँ UIViewControllerयदि आप प्रोग्राम को viewसंपत्ति सेट करना चाहते हैं तो एक उपवर्ग ओवरराइड करेगा ।

viewDidLoadवह विधि है जिसे दृश्य लोड होने के बाद कहा जाता है। इसे लोड व्यू के बाद कहा जाता है। यह एक ऐसी जगह है जहाँ आप कोड को ओवरराइड और इंसर्ट कर सकते हैं जो लोड होने के बाद व्यू के आगे के शुरुआती सेटअप को करता है।


14
viewDidLoad()

का उपयोग तब किया जाता है जब आप अपना दृश्य एनआईबी से लोड करते हैं और लॉन्च के बाद कोई अनुकूलन करना चाहते हैं

LoadView()

जब आप अपने दृश्य को प्रोग्रामेटिक रूप से बनाना चाहते हैं (इंटरफ़ेस बिल्डर के उपयोग के बिना)


यह कुछ समस्या हो सकती है, मेरे पास परीक्षण है जब मेरा दृश्य नियंत्रक
एनआईबी

11

NilObject ने जो बताया, उसे प्रदर्शित करने के लिए कुछ कोड उदाहरण जोड़कर:

- (void)loadView
{
    // create and configure the table view
    myTableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame] style:UITableViewStyleGrouped];   
    myTableView.delegate = self;
    myTableView.dataSource = self;
    myTableView.scrollEnabled = NO;
    self.view = myTableView;

    self.view.autoresizesSubviews = YES;
}

- (void)viewDidLoad 
{
  self.title = @"Create group";

  // Right menu bar button is to Save
  UIBarButtonItem *saveButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Save" style:UIBarButtonItemStyleDone target:self action:@selector(save)];
  self.navigationItem.rightBarButtonItem = saveButtonItem;
  [saveButtonItem release];
}

4
तो, आप दोनों के बीच, यह कहना सही है कि लोडव्यू वह है जहां मुझे अपने नियंत्रक के स्वयं के आबंटन / इनिट को करना चाहिए।
ryan.scott

2

जब आप self.view पढ़ते हैं, तो एक अनंत लूप को रोकने के लिए, जब आप किसी दृश्य को लोड करते हैं तो क्लास के सुपर कार्यान्वयन को कॉल करें। सुपर कार्यान्वयन आपके लिए एक नया यूआईवीयूई आवंटित करेगा।

- (void) loadView {
[super loadview];

// init code here...

[self.view addSubView:mySubview1]; //etc..

}

6
मैं शपथ ले सकता था Apple के प्रलेखन ने कहा कि आपको फोन नहीं करना चाहिए [super loadView];। उदाहरणों में इसका खंडन किया गया था, लेकिन मुझे लगता है कि डॉक्स ने इसे सही तरीके से कहा है (मुझे समय के साथ उदाहरणों में कई बग मिले हैं)। [super loadView]UITableViewController आदि के लिए आवश्यक है, यद्यपि। तथापि! कोई भी पोस्ट-लोड सेटअप (उदाहरण के लिए अतिरिक्त सबवे जोड़ना) viewDidLoad में किया जाना चाहिए।
इवान वुज़िका

मैंने अब तक बिना किसी साइड इफेक्ट के [सुपर लोड व्यू] कहा है। यह सच हो सकता है यदि आप स्वयं को स्वयं के लिए सेट करने का इरादा रखते हैं।
Futureelite7

अगर आप loadView के अंदर [सुपर loadView] कहते हैं तो यह डिफ़ॉल्ट नाम के साथ उपलब्ध होने पर दृश्य से दृश्य लोड करने का प्रयास करेगा। इसलिए आपको सावधान रहने की जरूरत है।
Ian1971

और अगर आप [सुपर लोडव्यू] कहते हैं, तो आप
स्वयं

1

LoadView का उपयोग करने का सबसे आसान तरीका कुछ प्रकार के बेस व्यू कंट्रोलर बनाना है, जैसे MyBaseViewController जो UIViewController का उपवर्ग है। इस तरह से यह लोड व्यू पद्धति में दृश्य बना सकता है:

-(void) loadView {
    if ([self viewFromNib]) {
        self.view = [self viewFromNib];
    } else {
        self.view = [[[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    }
    self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight;
    self.view.backgroundColor = [UIColor whiteColor];
}

और जब आपको कुछ व्यू कंट्रोलर बनाने की आवश्यकता होती है तो आप MyBaseViewController के सबक्लास का उपयोग करते हैं और इसमें लोडव्यू कंट्रोलर होता है जिसे आप इस तरह कहते हैं [सुपर loadView]

//sucblass loadView
-(void) loadView {
    [super loadView];

    //rest of code like this..
    UILabel *myLabel = [[UILabel alloc] initWithFrame:myFrame];
    [self.view addSubview:myLabel];
    [myLabel release];
}

1

loadView()कहा जाता है जब आपके नियंत्रक को इसका निर्माण करने के लिए कहा जाता है self.view। आप इसे अपने आप से कर सकते हैं जैसे

self.view = [UIView alloc] init...];

या आपके नियंत्रक के माता-पिता UIController वर्ग में पहले से ही एक विधि का नाम है -loadView()जो आपके self.view को रिक्त दृश्य में प्रारंभ करता है। तब आप कॉल कर सकते हैं

[super loadView];

मैं वास्तव में दूसरे दृष्टिकोण की सिफारिश करता हूं क्योंकि यह विरासत को प्रोत्साहित करता है। केवल तभी जब आपका व्यू कंट्रोलर सीधे UIViewController से विरासत में नहीं मिला हो।


0

ViewDidLoad पर Apple द्वारा दी गई परिभाषा में उल्लेख किया गया है कि यह नियंत्रक के दृश्य को मेमोरी में लोड करने के बाद कहा जाता है। इसे एक साधारण शब्द में कहें तो यह पहला तरीका है जो लोड करेगा।

आप सोच रहे होंगे कि इस पद्धति का पूरी तरह से उपयोग किस स्थिति में होगा? जवाब है, मूल रूप से जो कुछ भी आप चाहते थे कि ऐप पहले लोड हो। उदाहरण के लिए, आप एक अलग पृष्ठभूमि रंग चाहते हैं, सफेद के बजाय, आप शायद नीला चुन सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.