IBOutlet在自定义UIView中是零(使用STORYBOARD)

时间:2012-12-30 08:37:19

标签: objective-c uiview storyboard iboutlet

我有一个自定义UIView课程。在其中我已为IBOutlet声明了UIImageView属性。

#import <UIKit/UIKit.h>

@interface SettingItem : UIView{

}

@property (strong, nonatomic) IBOutlet UIImageView *myImage;

@end

现在我正在使用故事板。有一个viewcontroller。我将UIView拖到了viewcontroller。我拖了一个UIImageView作为上面UIView的子视图。我从故事板中将“SettingItem”类设置为UIView。我通过从实用程序窗口SettingItem的出口正常拖动来将插座连接到myImage。


SettingItem实施

#import "SettingItem.h"

@implementation SettingItem

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        [self baseInit];
    }
    return self;
}

-(id) initWithCoder:(NSCoder *)aDecoder{
    self = [super initWithCoder:aDecoder];
    if (self) {
        // Initialization code
        [self baseInit];
    }
    return self;
}

- (void) baseInit{
    NSLog(@"myImage %@"self.myImage);
}

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    // Drawing code
}
*/

@end

现在我的问题是myImage总是nil,高于NSLog,只需打印(null)即可。我检查了故事板中的视图并检查了它的出口参考,并指向myImage。我错过了什么。我用谷歌搜索帮助但找不到任何解决方案。

你能指出我做错了吗?

7 个答案:

答案 0 :(得分:67)

在视图中覆盖awakeFromNib - 这是在分配IBOutlet之后调用的第一个生命周期方法,并且是您代码的正确位置。

答案 1 :(得分:3)

在awakeFromNib中初始化它们:

- (void)awakeFromNib
{
    //init code
}

答案 2 :(得分:2)

我遇到了完全相同的问题,解决方案非常简单:

您很快就会访问myImage - 就是这样。

使用-(id) initWithCoder:(NSCoder *)aDecoder{- (id)initWithFrame:(CGRect)frame UIView尚未绘制。所以myImage还没有初始化。

如果添加UIButtonIBAction,可以对其进行测试,并执行以下操作:

- (IBAction)buttonClicked:(id)sender {
    NSLog(@"%@",myImage);
}

您将看到myImage不再是nil

答案 3 :(得分:0)

我有类似的问题,但我终于找出了什么是错的 - 这是XIB文件和Storyboard之间的成语差异。

在我用Xib文件看到的所有教程中,如果我有一个UITableViewController创建一个DetailViewController让我编辑表中项目的内容,那么tableViewController在它第一次显示时就创建了一次DVC实例它,但只要需要编辑列表中的另一个项目,就可以重用相同的DVC实例。

对于故事板,看起来每次表视图调用时,表视图显示的视图通常都是新创建的(并且它不会调用UIViewController模板中的init版本) 。如前所述,您必须等到“ViewDidLoad”才能访问任何控件,即使您之前已经显示过此视图。

我希望这会有所帮助。

答案 4 :(得分:0)

您是否可以不使用setter作为属性,那样在实际填充时就可以做所需的事情?

@IBOutlet weak var xxx:UIKitClass! {
  didSet { 
    outletSetup() 
  }
}

答案 5 :(得分:-3)

[self baseInit]内拨打-(void)viewWillAppear:(BOOL)animatedmyImage应该有值。

#import "SettingItem.h"

@implementation SettingItem

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code

    }
    return self;
}

-(id) initWithCoder:(NSCoder *)aDecoder{
    self = [super initWithCoder:aDecoder];
    if (self) {
        // Initialization code

    }
    return self;
}
-(void)viewWillAppear:(BOOL)animated
{
   [self baseInit];
}

- (void) baseInit{
    NSLog(@"myImage %@"self.myImage);
}

答案 6 :(得分:-6)

在.h文件中

,您需要替换代码:

#import <UIKit/UIKit.h>

@interface SettingItem : UIView{

}

@property (strong, nonatomic) IBOutlet UIImageView *myImage;

@end

使用此代码

#import <UIKit/UIKit.h>

@interface SettingItem : UIView{

  IBOutlet UIImageView*myImage;

}

@end

你实际上并没有告诉Xcode myImage是什么,你只是让它成为一个强大的非原子属性