21

我有一个自定义UIView课程。在里面我已经声明了一个 IBOutlet属性UIImageView

#import <UIKit/UIKit.h>

@interface SettingItem : UIView{

}

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

@end

现在我正在使用故事板。有一个视图控制器。我拖到UIView视图控制器。我拖了一个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. 我错过了一些东西。我搜索了帮助,但找不到任何解决方案。

你能指出我做错了什么吗?

4

7 回答 7

77

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

于 2014-06-26T13:11:39.363 回答
4

在 awakeFromNib 中初始化它们:

- (void)awakeFromNib
{
    //init code
}
于 2016-04-16T05:52:03.813 回答
2

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

您即将访问myImage- 就是这样。

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

如果添加 aUIButton和 anIBAction并执行以下操作,则可以对其进行测试:

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

你会看到如何myImage不再是nil

于 2013-01-13T18:26:15.323 回答
0

我有类似的问题,但我终于弄清楚出了什么问题 - 这是 XIB 文件和 Storyboard 之间的习语不同。

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

使用情节提要,看起来由表视图显示的视图通常在每次表视图调用它时创建一个新视图(并且它不会调用 UIViewController 模板中的 init 版本)。正如先前的答案所述,您必须等到“ViewDidLoad”才能访问任何控件,即使您之前已经显示过此视图。

我希望这有帮助。

于 2013-04-30T15:52:38.867 回答
0

您可以不使用属性的设置器,这样您就可以在实际填充时执行您需要的操作吗?

@IBOutlet weak var xxx:UIKitClass! {
  didSet { 
    outletSetup() 
  }
}
于 2019-11-28T12:04:18.170 回答
-4

[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);
}
于 2013-01-09T19:59:13.467 回答
-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 是什么,你只是让它成为一个强大的、非原子的属性

于 2012-12-30T09:02:11.930 回答