我试图基于UIScrollView创建自定义控件
控件应该通过其dataSource对象获取必要的信息(与UITableView或UIPickerView相同)
问题是我试图通过Interface Builder而不是代码来定义dataSource。 (例如,您可以将.UITableView数据源设置为.xib文件中的文件所有者)
这是我的新控件标题:
#import <UIKit/UIKit.h>
@protocol HorizontalPickerDataSource;
@interface HorizontalPicker : UIScrollView
@property (nonatomic,assign) IBOutlet id <HorizontalPickerDataSource> dataSource;
@end
@protocol HorizontalPickerDataSource
- (NSInteger)numberOfColumnsInHorizontalPicker:(HorizontalPicker *)horizontalPicker;
- (UIView *)horizontalPicker:(HorizontalPicker *)horizontalPicker viewForColumn:(NSInteger)column;
@end
非常简单。
采用HorizontalPicker的UIViewController应该是它的dataSource 我通过Interface Builder定义它,因为我将dataSource设置为IBOutlet
我覆盖了initWtihCoder并在那里记录了dataSource(当然是在创建了对象之后),它看起来是零。
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if(self){
NSLog(@"dataSource: %@",self.dataSource);
[self setup];
}
return self;
}
基于dataSource的设置方法整体逻辑不是零
为什么dataSource为零,我该如何解决呢?
谢谢你的时间(:
编辑#1
这是我对NSCoding的实现,它有什么问题?
- (id)initWithCoder:(NSCoder *)aDecoder
{
id dataSource = [aDecoder decodeObjectForKey:@"dataSource"];
self = [super initWithCoder:aDecoder];
if(self){
self.dataSource = dataSource;
NSLog(@"dataSource: %@",self.dataSource);
[self setup];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[super encodeWithCoder:aCoder];
[aCoder encodeObject:self.dataSource forKey:@"dataSource"];
}
答案 0 :(得分:0)
您必须完全实施NSCoding才能实现此目的。在您的情况下,您的initWithCoder:
未解码数据源。你需要做这样的事情:
- (id)initWithCoder:(NSCoder *)aDecoder {
id ds = [decoder decodeObjectForKey:@"dataSource"];
if(self = [self initWithDataSource:ds){
NSLog(@"dataSource: %@",self.dataSource);
[self setup];
}
return self;
}
您还应该在NSCoding encodeWithCoder:
中提供配套方法。