UIView工厂和代表

时间:2012-11-18 12:43:50

标签: ios uiview delegates

我想在UIView中绘制图表。问题是我如何获取视图的数据(点)。如果我创建一个协议并将UIViewController设置为UIView中的委托,我调用委托方法(initWithFrame?)可能是早期的,并且可能没有设置委托, awakeFromNib?但视图是100%在代码中创建的,它没有nib文件)..

3 个答案:

答案 0 :(得分:3)

  

initWithFrame?可能是早到,代表可能没有设置。

事实上,当你在initWithFrame:时,代表不能设置,因为你在分配后对对象做的第一件事就是初始化,i。即直到init方法返回,你不能调用(好吧,至少在其他任何方法都不要这样做)。

您需要做的是使用loadDatareloadData方法,委托必须在将自己设置为视图的委托后明确调用。例如,从视图控制器中,您可以这样称呼它:

@implementation ChartViewController

- (id)init
{
    if ((self = [super init])) {
        chartView = [[ChartView alloc] initWithFrame:self.view.frame];
        chartView.delegate = self;
        [self.view addSubview:chartView];
        [chartView reloadData];
    }
    return self;
}

然后,在图表图纸视图中,按如下方式实施- reloadData

- (void)reloadData
{
    // Call the delegate here,
    // then do the drawing
}

答案 1 :(得分:0)

制定协议,但不要将其称为委托。称之为dataSource:D

无论如何,当你第一次需要数据时调用它......尽可能晚..不要在init ..也许在setDataSource调用中。

或第一次画画时看到你没有数据..


查看UITableView以了解他是如何做到的并模仿

答案 2 :(得分:0)

更好的方法是使用UIViewController代替UIView。因为您的视图必须管理数据。管理数据是UIViewController的工作。