我有一个自定义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
。我错过了什么。我用谷歌搜索帮助但找不到任何解决方案。
你能指出我做错了吗?
答案 0 :(得分:67)
在视图中覆盖awakeFromNib - 这是在分配IBOutlet之后调用的第一个生命周期方法,并且是您代码的正确位置。
答案 1 :(得分:3)
在awakeFromNib中初始化它们:
- (void)awakeFromNib
{
//init code
}
答案 2 :(得分:2)
我遇到了完全相同的问题,解决方案非常简单:
您很快就会访问myImage
- 就是这样。
使用-(id) initWithCoder:(NSCoder *)aDecoder{
和- (id)initWithFrame:(CGRect)frame
UIView
尚未绘制。所以myImage还没有初始化。
如果添加UIButton
和IBAction
,可以对其进行测试,并执行以下操作:
- (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)animated
。 myImage
应该有值。
#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)
,您需要替换代码:
#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是什么,你只是让它成为一个强大的非原子属性