Saat bekerja dengan tampilan dan pengontrol tampilan di aplikasi iPhone, adakah yang bisa menjelaskan perbedaan antara loadView dan viewDidLoad?
Konteks pribadi saya, adalah bahwa saya membangun semua pandangan saya dari kode, saya tidak dan tidak akan menggunakan Interface Builder, jika itu membuat perbedaan.
Saya sering menemukan bahwa ketika saya menambahkan kode init ke loadView, saya berakhir dengan pelacakan tumpukan tak terbatas, jadi saya biasanya melakukan semua bangunan tampilan anak saya di viewDidLoad ... tetapi bagi saya tidak jelas kapan masing-masing dieksekusi, dan apa tempat yang lebih tepat untuk meletakkan kode init. Apa yang akan sempurna, adalah diagram sederhana dari panggilan inisialisasi.
Terima kasih!
sumber
-(void) loadView { // Frame for Hypnosis view CGRect frame = [[UIScreen mainScreen] bounds]; // Create a Hipnosis view v = [[HypnosisView alloc] initWithFrame:frame]; self.view = v;
loadView
adalah metodeUIViewController
yang benar-benar akan memuat tampilan dan menetapkannya keview
properti. Ini juga merupakan lokasi yangUIViewController
akan diganti oleh subclass jika Anda ingin menyiapkanview
properti secara terprogram.viewDidLoad
adalah metode yang dipanggil setelah tampilan dimuat. Ini disebut setelah loadView dipanggil. Ini adalah tempat di mana Anda dapat mengganti dan menyisipkan kode yang melakukan penyiapan awal lebih lanjut dari tampilan setelah dimuat.sumber
digunakan saat Anda memuat tampilan dari NIB dan ingin melakukan penyesuaian apa pun setelah peluncuran
digunakan saat Anda ingin membuat tampilan secara terprogram (tanpa menggunakan Interface Builder)
sumber
Hanya menambahkan beberapa contoh kode untuk menunjukkan apa yang dikatakan 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]; }
sumber
Untuk mencegah pengulangan tak terbatas terjadi saat Anda membaca self.view, panggil implementasi super kelas saat Anda memuat tampilan. Penerapan super akan mengalokasikan UIView baru untuk Anda.
- (void) loadView { [super loadview]; // init code here... [self.view addSubView:mySubview1]; //etc.. }
sumber
[super loadView];
. Itu bertentangan dalam contoh, tetapi saya pikir dokumen mengatakannya dengan benar (saya telah menemukan banyak bug dalam contoh dari waktu ke waktu).[super loadView]
diperlukan untuk UITableViewController dll. Namun! Semua pengaturan pasca-pemuatan (misalnya menambahkan subview ekstra) harus dilakukan di viewDidLoad.Cara termudah untuk menggunakan loadView adalah membuat beberapa jenis pengontrol tampilan dasar, seperti MyBaseViewController yang merupakan subkelas dari UIViewController. Dalam metode loadView, buat tampilan dengan cara ini:
-(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]; }
Dan ketika Anda perlu membuat beberapa pengontrol tampilan, Anda cukup menggunakan subkelas MyBaseViewController dan di pengontrol loadView Anda cukup memanggil [super loadView] seperti ini
//sucblass loadView -(void) loadView { [super loadView]; //rest of code like this.. UILabel *myLabel = [[UILabel alloc] initWithFrame:myFrame]; [self.view addSubview:myLabel]; [myLabel release]; }
sumber
loadView()
dipanggil saat pengontrol Anda diminta untuk membuatnyaself.view
. Anda bisa melakukannya sendiri sepertiself.view = [UIView alloc] init...];
Atau kelas UIController induk pengontrol Anda sudah memiliki nama metode
-loadView()
yang menginisialisasi self.view Anda ke tampilan kosong. Kemudian Anda bisa menelepon[super loadView];
Saya sangat merekomendasikan pendekatan kedua karena mendorong warisan. Hanya jika pengontrol tampilan Anda tidak secara langsung diwarisi dari UIViewController.
sumber
Definisi yang diberikan oleh Apple pada viewDidLoad menyebutkan bahwa itu dipanggil setelah tampilan pengontrol dimuat ke dalam memori. Sederhananya, ini adalah metode pertama yang akan dimuat.
Anda mungkin berpikir dalam kondisi apa metode ini akan digunakan sepenuhnya? Jawabannya adalah, pada dasarnya apa pun yang Anda inginkan agar aplikasi dimuat terlebih dahulu. Misalnya, Anda mungkin menginginkan warna latar belakang yang berbeda, daripada putih, Anda mungkin dapat memilih biru.
sumber