nib文件中的对象与代码中的IBOutlet对象无关

时间:2010-11-10 22:14:08

标签: iphone objective-c

好吧,我正在把头发拉到这上面,这没有任何意义,所以它必须是一个错误,或者是我正在制造的一些极其愚蠢的错误。

以下是这种情况:我有一个带有xib文件的UIViewController。它有一个连接到view属性的UIView,一个连接到一个名为imageView的属性的UIImageView,以及一个连接到segmentControl的UISegmentedControl。

然而在我的代码中,我无法将图像分配给图像视图。当我NSLog对象时,我得到0x0的地址,所以它根本没有关联。我在Interface builder中设置了绑定,我重新启动了XCode并清理并构建了项目。没有什么工作,我浪费了一大笔时间试图弄清楚这一点。我还NSLoged segmentControl对象,并获得0x0。因此,XIB没有与代码挂钩,但是XIB本身正在加载,因为对象显示在屏幕上。

有没有人对我可能遗失的内容有任何想法?这是一件非常简单的事情,令人难以置信的是,它拒绝突然工作。


下面是下面的代码,在这种情况下,我正在访问projectId的setter中的对象,但我也尝试从另一个类访问imageView,它也不起作用(是的,我有@property声明和我尝试时合成for 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

2 个答案:

答案 0 :(得分:3)

您需要确保在-viewDidLoad方法中执行此操作,否则nib文件实际上没有取消归档对象,因此它们将设置为nil。特别是,您无法在-init方法中访问笔尖中的项目。

但是,如果没有看到您的代码,很难说是否适合您。

编辑:好的,谢谢您发布代码。何时调用-setProjectId:?你确定笔尖已经完成加载了吗?您的视图控制器中没有viewDidLoad方法,因此您似乎无法随时检查此方法。

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

  

viewDidLoad中

     

在控制器的视图加载到内存后调用。

     
      
  • (无效)viewDidLoad中
  •   
     

讨论

     

在视图控制器将其关联的视图加载到内存后调用此方法。无论视图是存储在nib文件中还是以编程方式在loadView方法中创建,都会调用此方法。此方法最常用于对从nib文件加载的视图执行其他初始化步骤。

答案 1 :(得分:0)

当您连接IBOutlets时听起来出了问题。

在IB中右键单击UISegmentedControl并发布截图,以便我们可以看到您拥有的内容。如果你看到任何“黄色”,那么你可能已经找到了问题。