วัตถุในไฟล์ nib ไม่เชื่อมโยงกับวัตถุ IBOutlet ในโค้ด

โอเค ฉันกำลังทำสิ่งนี้อยู่ มันไม่สมเหตุสมผลเลย ดังนั้นมันต้องเป็นแมลง หรือฉันทำผิดพลาดโง่ๆ บางอย่างลงไป

นี่คือสถานการณ์: ฉันมี UIViewController พร้อมไฟล์ xib มันมี UIView เชื่อมต่อกับคุณสมบัติมุมมอง UIImageView เชื่อมต่อกับคุณสมบัติที่เรียกว่า imageView และ UISegmentedControl เชื่อมต่อกับส่วนควบคุม

แต่ในโค้ดของฉัน ฉันไม่สามารถกำหนดรูปภาพให้กับมุมมองรูปภาพได้ เมื่อฉัน NSLog วัตถุ ฉันได้รับที่อยู่ 0x0 ดังนั้นจึงไม่มีการเชื่อมโยงเลย ฉันได้ตั้งค่าการเชื่อมโยงในตัวสร้างส่วนต่อประสานแล้ว ฉันได้รีสตาร์ท XCode และล้างและสร้างโปรเจ็กต์แล้ว ไม่มีอะไรทำงานและฉันเสียเวลาไปมากในการพยายามคิดออก ณ จุดนี้ ฉันยังได้ NSLoged วัตถุเซ็กเมนต์Control และได้รับ 0x0 เช่นกัน ดังนั้นจึงไม่มีสิ่งใดจาก XIB ที่เกี่ยวข้องกับโค้ด แต่ XIB เองกำลังโหลดเนื่องจากมีวัตถุแสดงบนหน้าจอ

ไม่มีใครมีความคิดใด ๆ เลยเกี่ยวกับสิ่งที่ฉันอาจพลาดไป? นี่เป็นเรื่องง่ายๆ ที่น่าหงุดหงิดอย่างยิ่งที่จู่ๆ ก็ปฏิเสธที่จะทำงาน


นี่คือโค้ดด้านล่างนี้ ในกรณีนี้ ฉันกำลังเข้าถึงอ็อบเจ็กต์ในตัวตั้งค่าสำหรับ projectId แต่ฉันก็ลองเข้าถึง imageView จากคลาสอื่นด้วย แต่มันก็ไม่ได้ผลเช่นกัน (และใช่ ฉันมีการประกาศ @property และสังเคราะห์สำหรับ imageView เมื่อฉันพยายาม)

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

และนี่คือรูปภาพการเชื่อมต่อของ Interface Builder: http://i52.tinypic.com/2eakprl.png


person Ben Baron    schedule 10.11.2010    source แหล่งที่มา
comment
โพสต์โค้ดจากคอนโทรลเลอร์ของคุณ โดยที่สิ่งเหล่านี้ไม่มี และที่ที่คุณตั้งค่า ปัญหาแรกของฉันคือคุณกำลังใช้คุณสมบัติ getter ภายใน -loadView แต่ฉันต้องการเห็นโค้ดบางส่วนเพื่อให้เราสามารถตอบคำถามนี้ได้อย่างถูกต้อง   -  person jer    schedule 11.11.2010
comment
อัปเดตโปรเจ็กต์ด้วยโค้ดและภาพหน้าจอ IB ซึ่งสมเหตุสมผลแล้ว มันเป็นตัวควบคุมมุมมองที่ง่ายที่สุดที่ฉันเคยรวบรวมมาและปฏิเสธที่จะทำงาน   -  person Ben Baron    schedule 11.11.2010


คำตอบ (2)


คุณต้องแน่ใจว่าคุณกำลังทำเช่นนี้ในเมธอด -viewDidLoad ไม่เช่นนั้นไฟล์ nib จะไม่ได้ยกเลิกการเก็บถาวรอ็อบเจ็กต์จริง ๆ ดังนั้น จึงตั้งค่าเป็นศูนย์ โดยเฉพาะอย่างยิ่ง คุณไม่สามารถเข้าถึงรายการจากปลายปากกาภายในวิธี -init

หากไม่เห็นรหัสของคุณ เป็นการยากที่จะบอกว่าเป็นกรณีนี้สำหรับคุณหรือไม่

แก้ไข: ตกลงขอบคุณสำหรับการโพสต์รหัส -setProjectId: จะถูกเรียกใช้เมื่อใด คุณแน่ใจหรือว่าหัวปากกาโหลดเสร็จแล้วในตอนนี้? คุณไม่มีเมธอด viewDidLoad ในตัวควบคุมมุมมอง ดังนั้นดูเหมือนว่าคุณจะไม่ตรวจสอบสิ่งนี้เลย

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

ดูDidLoad

เรียกหลังจากโหลดมุมมองของคอนโทรลเลอร์ลงในหน่วยความจำแล้ว

  • (เป็นโมฆะ) viewDidLoad

การอภิปราย

วิธีการนี้ถูกเรียกหลังจากที่ตัวควบคุมมุมมองได้โหลดมุมมองที่เกี่ยวข้องลงในหน่วยความจำ วิธีการนี้ถูกเรียกโดยไม่คำนึงว่ามุมมองจะถูกจัดเก็บไว้ในไฟล์ nib หรือสร้างขึ้นโดยทางโปรแกรมในวิธี loadView หรือไม่ วิธีการนี้ใช้กันมากที่สุดเพื่อดำเนินการขั้นตอนการเริ่มต้นเพิ่มเติมในมุมมองที่โหลดจากไฟล์ปลายปากกา

person d11wtq    schedule 10.11.2010
comment
ขอบคุณ! ย้ายตรรกะไปที่เมธอด viewWillAppear: และใช้งานได้แล้ว ฉันมักจะสร้างตัวควบคุมมุมมองของฉันในเมธอด viewDidLoad หรือ viewWillAppear: ไม่แน่ใจว่าทำไมฉันจึงทำแตกต่างออกไปในครั้งนี้ ฉันรู้ว่ามันต้องเป็นความผิดพลาดโง่ๆ ที่ฉันทำลงไป ขอบคุณอีกครั้ง! - person Ben Baron; 11.11.2010

ดูเหมือนมีบางอย่างผิดพลาดเมื่อคุณต่อสาย IBOutlets

ใน IB คลิกขวาที่ UISegmentedControl และโพสต์ภาพหน้าจอเพื่อให้เราเห็นว่าคุณมีอะไรบ้าง หากคุณเห็นสิ่งที่ 'สีเหลือง' แสดงว่าคุณอาจพบปัญหาของคุณแล้ว

person nicktmro    schedule 10.11.2010
comment
กลัวว่ามันไม่ง่ายขนาดนั้น ฉันได้ตรวจสอบทุกอย่างชัดเจนแล้ว ไม่มีเหตุผลใดที่ฉันจะเห็นว่าสิ่งนี้ใช้งานไม่ได้ มันทำให้ฉันโกรธจริงๆ - person Ben Baron; 11.11.2010
comment
ดูการอัปเดตในโพสต์ของฉัน ฉันได้รวมโค้ดและภาพหน้าจอจาก IB แล้ว - person Ben Baron; 11.11.2010
comment
มีความเป็นไปได้น้อยมากที่วัตถุจะไม่ถูกโหลด เป็นไปได้มากว่าไฟล์เหล่านั้นจะไม่โหลดในขณะที่มีการเข้าถึง เมื่อทำงานกับ nibs คุณต้องแน่ใจว่าคุณได้ใช้วิธีการที่ให้ข้อเสนอแนะเกี่ยวกับสถานะของเนื้อหา nib (เช่น -viewDidLoad ใน UIViewController) - person d11wtq; 11.11.2010
comment
ประกาศคุณสมบัติและสังเคราะห์ SegmentedControl และ ImageView ซึ่งอาจช่วยได้ - person nicktmro; 11.11.2010