Objek dalam file nib tidak terkait dengan objek IBOutlet dalam kode

Oke, saya serius dalam hal ini, tidak masuk akal jadi itu pasti bug, atau kesalahan sangat bodoh yang saya buat.

Begini situasinya: Saya punya UIViewController dengan file xib. Ia memiliki UIView yang terhubung ke properti view, UIImageView terhubung ke properti bernama imageView, dan UISegmentedControl terhubung ke segmentControl.

Namun dalam kode saya, saya tidak dapat menetapkan gambar ke tampilan gambar. Saat saya NSLog objeknya, saya mendapatkan alamat 0x0, jadi tidak terkait sama sekali. Saya telah mengatur pengikatan di pembuat Antarmuka, saya telah memulai ulang XCode dan membersihkan serta membangun proyek. Tidak ada yang berhasil dan saya telah membuang banyak waktu untuk mencoba memikirkan hal ini pada saat ini. Saya juga telah NSLog objek segmentControl dan saya mendapatkan 0x0 juga. Jadi tidak ada apa pun dari XIB yang terhubung dengan kodenya, tetapi XIB itu sendiri sedang memuat karena objeknya ditampilkan di layar.

Adakah yang punya ide tentang apa yang mungkin saya lewatkan? Ini adalah hal yang sangat sederhana, sangat membuat frustrasi karena tiba-tiba tidak berfungsi.


Berikut kode di bawah ini, dalam hal ini saya mengakses objek di setter untuk projectId, tetapi saya juga mencoba mengakses imageView dari kelas lain dan tidak berhasil juga (dan ya, saya memiliki deklarasi @property dan mensintesis untuk imageView ketika saya mencoba).

DiagramViewController.h:

#import <UIKit/UIKit.h>


@interface DiagramViewController : UIViewController 
{
    NSUInteger projectId;
    IBOutlet UIImageView *imageView;
    IBOutlet UISegmentedControl *segmentControl;
}

@property NSUInteger projectId;

@end

DiagramViewController.m:

#import "DiagramViewController.h"

@implementation DiagramViewController
@synthesize projectId;

-(void)setProjectId:(NSUInteger)projId
{
    NSLog(@"imageView: %@", imageView);
    NSLog(@"segmentControl: %@", segmentControl);

    projectId = projId;

    NSString *filePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%i_schem", projectId] ofType:@"png" inDirectory:@"project-details/images/diagrams"];
    NSData *imageData = [NSData dataWithContentsOfFile:filePath];

    imageView.image = [UIImage imageWithData:imageData];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Overriden to allow any orientation.
    return YES;
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)dealloc {
    [super dealloc];
}

@end

Dan inilah gambar hookup Interface Builder: http://i52.tinypic.com/2eakprl.png


person Ben Baron    schedule 10.11.2010    source sumber
comment
Posting beberapa kode dari pengontrol Anda, di mana semuanya nihil, dan di mana Anda mengaturnya. Firasat pertama saya adalah Anda menggunakan properti pengambil di dalam -loadView, tapi saya ingin melihat beberapa kode sehingga kami dapat menjawabnya dengan benar.   -  person jer    schedule 11.11.2010
comment
Memperbarui proyek dengan kode dan tangkapan layar IB, ini tidak masuk akal, ini adalah pengontrol tampilan paling sederhana yang pernah saya buat dan menolak untuk bekerja.   -  person Ben Baron    schedule 11.11.2010


Jawaban (2)


Anda perlu memastikan bahwa Anda melakukan ini dalam metode -viewDidLoad, jika tidak, file nib belum benar-benar membatalkan pengarsipan objek sehingga objek tersebut akan disetel ke nihil. Khususnya, Anda tidak dapat mengakses item dari ujung pena dalam metode -init.

Namun tanpa melihat kode Anda, sulit untuk mengatakan apakah ini yang terjadi pada Anda.

EDIT: Oke, terima kasih telah memposting kode. Kapan -setProjectId: dipanggil? Apakah Anda yakin ujung pena sudah selesai dimuat saat ini? Anda tidak memiliki metode viewDidLoad di pengontrol tampilan sehingga tampaknya Anda tidak pernah memeriksanya kapan pun.

Lihat: http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html

viewDidLoad

Dipanggil setelah tampilan pengontrol dimuat ke dalam memori.

  • (batal) lihat DidLoad

Diskusi

Metode ini dipanggil setelah pengontrol tampilan memuat tampilan terkaitnya ke dalam memori. Metode ini dipanggil terlepas dari apakah tampilan disimpan dalam file nib atau dibuat secara terprogram dalam metode loadView. Metode ini paling sering digunakan untuk melakukan langkah inisialisasi tambahan pada tampilan yang dimuat dari file nib.

person d11wtq    schedule 10.11.2010
comment
Terima kasih! Memindahkan logika ke dalam metode viewWillAppear: dan sekarang berfungsi. Saya biasanya membuat pengontrol tampilan dalam metode viewDidLoad atau viewWillAppear:, tidak yakin mengapa saya melakukannya secara berbeda kali ini. Aku tahu itu pasti kesalahan bodoh yang kubuat. Terima kasih lagi! - person Ben Baron; 11.11.2010

Sepertinya ada yang tidak beres saat Anda menyambungkan IBOutlets.

Di IB klik kanan pada UISegmentedControl dan posting tangkapan layar sehingga kami dapat melihat apa yang Anda miliki di sana. Jika Anda melihat sesuatu yang 'kuning' maka Anda mungkin telah menemukan masalah Anda.

person nicktmro    schedule 10.11.2010
comment
Takutnya tidak sesederhana itu. Saya sudah memeriksa semuanya dengan jelas. Tidak ada alasan bagi saya untuk melihat bahwa ini tidak berhasil. Ini benar-benar membuatku kesal. - person Ben Baron; 11.11.2010
comment
Lihat pembaruan pada postingan saya. Saya telah menyertakan kode dan tangkapan layar dari IB - person Ben Baron; 11.11.2010
comment
Sangat kecil kemungkinannya bahwa objek tersebut tidak dimuat. Kemungkinan besar mereka tidak dimuat pada saat sedang diakses. Saat bekerja dengan nib, Anda perlu memastikan bahwa Anda mengimplementasikan metode yang memberikan umpan balik tentang status konten nib (yaitu -viewDidLoad di UIViewController). - person d11wtq; 11.11.2010
comment
Deklarasikan properti dan sintesis segmentedControl dan imageView, mungkin itu membantu. - person nicktmro; 11.11.2010