创建自定义控件 - DataSource为零

时间:2014-07-30 01:30:50

标签: ios objective-c xib


我试图基于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

非常简单。

采用Horizo​​ntalPicker的UIViewController应该是它的dataSource 我通过Interface Builder定义它,因为我将dataSource设置为IBOutlet  enter image description here

我覆盖了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"];
}

1 个答案:

答案 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:中提供配套方法。