আইফোন এসডিকে: লোডভিউ এবং ভিউডিডলডের মধ্যে পার্থক্য কী?


136

কোনও আইফোন অ্যাপ্লিকেশনটিতে দেখা ও দেখার নিয়ন্ত্রকদের সাথে কাজ করার সময়, কেউই লোডভিউ এবং ভিউডিডলডের মধ্যে পার্থক্যটি ব্যাখ্যা করতে পারে?

আমার ব্যক্তিগত প্রসঙ্গটি হ'ল আমি কোড থেকে আমার সমস্ত দৃষ্টিভঙ্গি তৈরি করি, আমি কোনও ইন্টারফেস বিল্ডার ব্যবহার করি না এবং ব্যবহার করব না, তাতে কোনও পার্থক্য হওয়া উচিত।

আমি দেখতে পেয়েছি যে লোডভিউতে আমি যখন ডিআইএস কোড যুক্ত করি তখন আমি একটি অসীম স্ট্যাক ট্রেস দিয়ে শেষ করি, তাই আমি সাধারণত আমার সমস্ত চাইল্ড-ভিউ বিল্ডিং ভিউডিডলয়েডে করি ... তবে প্রত্যেকটি মৃত্যুদন্ড কার্যকর হওয়ার পরে এটি আমার কাছে সত্যই অস্পষ্ট and আর ডি কোড দেওয়ার জন্য আরও উপযুক্ত জায়গা কি। কি নিখুঁত হবে, এটি সূচনা কলগুলির একটি সাধারণ চিত্র।

ধন্যবাদ!

উত্তর:


200

আমি অনুমান করতে পারি এখানে কী সমস্যা হতে পারে, কারণ আমি এটি করেছি:

আমি দেখতে পেয়েছি যে লোডভিউতে আমি যখন ডিএস কোড যুক্ত করি তখন আমি অসীম স্ট্যাক ট্রেস দিয়ে শেষ করি

লোডভিউতে সেলফ.ভিউ পড়বেন না। কেবল এটি সেট করুন, এটি পাবেন না।

স্বতঃভিউ সম্পত্তি সম্পত্তি অ্যাক্সেসর কল করে - ভিউ দেখুনটি ভিউটি বর্তমানে লোড করা হয়নি। আপনার অসীম পুনরাবৃত্তি আছে।

অ্যাপল-এর ​​প্রাক-ইন্টারফেস-বিল্ডারের উদাহরণগুলিতে যেমন লোড-ভিউ-তে প্রোগ্রামটিভভাবে ভিউটি তৈরি করা যায় তার সাধারণ উপায়টি আরও এরকম:

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;
ব্যবহারকারী 2054339

44

loadViewসেই পদ্ধতিতে UIViewControllerআসলে দৃশ্যটি লোড হবে এবং এটি viewসম্পত্তিতে নির্ধারিত হবে । UIViewControllerআপনি যদি প্রগ্রেটিভভাবে viewসম্পত্তি সেট আপ করতে চান তবে এটির একটি অবস্থানও ওভাররাইড হবে ।

viewDidLoadভিউটি লোড হয়ে গেলে সেই পদ্ধতিটি বলা হয়। লোডভিউ বলা হওয়ার পরে এটি বলা হয়। এটি এমন একটি জায়গা যেখানে আপনি কোডটি ওভাররাইড এবং সন্নিবেশ করতে পারেন যা একবার দেখার পরে লোড হয়ে যাওয়ার পরে এটির আরও প্রাথমিক সেটআপ করে।


14
viewDidLoad()

আপনি যখন কোনও এনআইবি থেকে আপনার ভিউ লোড করেন এবং লঞ্চের পরে কোনও কাস্টমাইজেশন সম্পাদন করতে চান তখন তা ব্যবহার করতে হবে

LoadView()

আপনি যখন নিজের মতামতটি প্রোগ্রামিয়্যাটিকভাবে তৈরি করতে চান তখন ব্যবহার করতে হবে (ইন্টারফেস বিল্ডারের ব্যবহার ছাড়াই)


এটিতে কিছু সমস্যা হতে পারে, আমার পরীক্ষাটি যখন আমার ভিউ কন্ট্রোলার এনআইবি ফাইলের সাথে সংযুক্ত ছিল না, দ্য ডিডলয়েড এখনও কল করেছে
রুন্দাও

11

নিলবজেক্ট যা বলেছিল তা প্রদর্শনের জন্য কিছু কোড উদাহরণ যুক্ত করে:

- (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

আপনি যখন স্ব.ভিউ পড়েন তখন অসীম লুপটি রোধ করতে, যখন কোনও ভিউ লোড করবেন তখন ক্লাসটিকে 'সুপার বাস্তবায়ন' বলুন। সুপার বাস্তবায়ন আপনার জন্য একটি নতুন ইউআইভিউ বরাদ্দ করবে।

- (void) loadView {
[super loadview];

// init code here...

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

}

6
আমি শপথ করতে পেরেছিলাম অ্যাপলের ডকুমেন্টেশন বলেছিল আপনার কল করা উচিত নয় [super loadView];। উদাহরণগুলিতে এটি বিরোধী ছিল, তবে আমার কাছে মনে হয় নথিগুলি এটি সঠিকভাবে বলেছিল (সময়ের সাথে সাথে আমি অসংখ্য বাগ খুঁজে পেয়েছি)। [super loadView]যদিও ইউআইটিএবল ভিউ কনট্রোলার ইত্যাদির জন্য প্রয়োজন। যাহোক! যেকোন পোস্ট-লোড সেটআপ (উদাহরণস্বরূপ অতিরিক্ত সাবভিউ যুক্ত করা) ভিউডিডডে করা উচিত।
ইভান ভুইসিকা

আমি এ পর্যন্ত কোনও পার্শ্ব প্রতিক্রিয়া ছাড়াই [সুপার লোডভিউ] কল করেছি। আপনি যদি নিজেকে তৈরি করেছেন এমন কিছুতে স্ব.উভিউ সেট করার পরিকল্পনা করেন তবে এটি সত্য হতে পারে।
ভবিষ্যতলাইট 7

যদি আপনি লোডভিউয়ের ভিতরে [সুপার লোডভিউ] কল করেন তবে এটি ডিফল্ট নাম সহ উপলভ্য থাকলে কোনও নিব থেকে ভিউ লোড করার চেষ্টা করবে। সুতরাং আপনার সতর্ক হওয়া দরকার।
Ian1971

এবং যদি আপনি [সুপার লোডভিউ] কল করেন, আপনি সুপার লোডভিউ পদ্ধতিতে সেলফ ভিউ শুরু করুন
অ্যালেক্স নাজারস্কি

1

লোডভিউ ব্যবহারের সহজ উপায় হ'ল মাইবেসভিউ কনট্রোলার মত কিছু ধরণের বেস ভিউ কন্ট্রোলার তৈরি করা যা ইউআইভিউকন্ট্রোলারের সাবক্লাস। এটিতে লোডভিউ পদ্ধতিতে ভিউ তৈরি করুন:

-(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];
}

এবং যখন আপনাকে কিছু ভিউ কন্ট্রোলার তৈরি করতে হবে তখন আপনি কেবল মাইবেসভিউ কনট্রোলারের সাবক্লাস ব্যবহার করেন এবং এর লোডভিউ কন্ট্রোলারে আপনি কেবল [সুপার লোডভিউ] কল করুন

//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...];

বা আপনার নিয়ামকের পিতামাতার ইউআইসি নিয়ন্ত্রণকারী শ্রেণিতে ইতিমধ্যে একটি পদ্ধতির নাম রয়েছে -loadView()যা আপনার সেলফ ভিউকে ফাঁকা দৃষ্টিতে সূচনা করে। তারপরে আপনি কল করতে পারেন

[super loadView];

উত্তরাধিকারকে উত্সাহিত করে আমি দ্বিতীয় পদ্ধতির সত্যই প্রস্তাব দিই। কেবলমাত্র যদি আপনার ভিউ কন্ট্রোলার সরাসরি ইউআইভিউউকন্ট্রোলার থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় না।


0

ভিউডিডলডে অ্যাপল প্রদত্ত সংজ্ঞাটিতে উল্লেখ করা হয়েছে যে কন্ট্রোলারের ভিউ মেমরিতে লোড হওয়ার পরে এটি ডাকা হয়। এটিকে একটি সাধারণ পদে রাখতে, এটি প্রথম পদ্ধতি যা লোড হবে।

আপনি ভাবছেন যে কোন পরিস্থিতিতে এই পদ্ধতিটি পুরোপুরি ব্যবহার করা হবে? উত্তরটি হ'ল, মূলত আপনি যা যা অ্যাপ্লিকেশনটি লোড করতে চান তা প্রথমে। উদাহরণস্বরূপ, আপনি সাদা পরিবর্তে আলাদা পটভূমির রঙ চাইবেন, আপনি সম্ভবত নীল বেছে নিতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.