设置后,View的dataSource属性设置为nil

时间:2011-12-05 03:44:14

标签: objective-c ios5

这里是iOS / Objective-C的新手。我花了很多时间试图解决这个问题,但却无法管理它。这是正在发生的事情:

  • 点击RootViewController视图中的“图表”按钮
  • GraphViewController接管,有一个graphView属性
  • 我将graphView的dataSource属性设置为self
  • 使用NSLog检查self.graphView.dataSource确认它确实指向了自己
  • 调用GraphView的drawRect:时,self.dataSource设置为(null),我希望它指向GraphViewController对象

总结一下:我在视图控制器中实例化graphView属性,然后设置其dataSource,但是当调用视图的drawRect:时,不再设置dataSource。

GraphViewController.m:

#import "GraphViewController.h"
#import "GraphView.h"

@implementation GraphViewController

@synthesize graphView = _graphView;
@synthesize program = _program;

- (GraphView *)graphView {
    if(!_graphView) {
        _graphView = [[GraphView alloc] init];
        [_graphView setDataSource:(id)self];
    }
    return _graphView;
}

@end

GraphViewController.h:

#import <UIKit/UIKit.h>
#import "GraphView.h"

@interface GraphViewController : UIViewController
@property (strong, nonatomic) IBOutlet GraphView *graphView;
@end

GraphView.m:

#import "GraphView.h"

@implementation GraphView

@synthesize dataSource = _dataSource;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        NSLog(@"initWithFrame called, self.dataSource=%@", self.dataSource);
    }
    return self;
}

- (void)drawRect:(CGRect)rect
{
    NSLog(@"drawRect:");
    NSLog(@"\tself=%@", self);
    NSLog(@"\tself.dataSource=%@", self.dataSource);  // is (null), shouldn't be
    [self.dataSource programToGraph];
}

@end

GraphView.h:

#import <UIKit/UIKit.h>

@class GraphView;

@protocol GraphViewDataSource
- (id)programToGraph;
@end

@interface GraphView : UIView

@property (nonatomic, weak) IBOutlet id <GraphViewDataSource> dataSource;

@end

1 个答案:

答案 0 :(得分:0)

所以看起来GraphViewController实例正在被释放,这将使dataSource属性无效。

所以你应该回过头来看看你是如何创建和管理GraphViewController的。一个常见的错误是创建一个这样的视图控制器,然后借用它的视图并将其抛入其他视图控制器的视图层次结构中,然后让原始视图控制器消失。

我会看一下,如果你没有看到它,请在你创建的代码中发布并呈现GraphViewController。

哦,你在哪里调用initWithFrame:从??看起来你可能还有两个不同的GraphView实例。尝试使用self.datasource记录'self'以检查它。