这里是iOS / Objective-C的新手。我花了很多时间试图解决这个问题,但却无法管理它。这是正在发生的事情:
总结一下:我在视图控制器中实例化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
答案 0 :(得分:0)
所以看起来GraphViewController实例正在被释放,这将使dataSource属性无效。
所以你应该回过头来看看你是如何创建和管理GraphViewController的。一个常见的错误是创建一个这样的视图控制器,然后借用它的视图并将其抛入其他视图控制器的视图层次结构中,然后让原始视图控制器消失。
我会看一下,如果你没有看到它,请在你创建的代码中发布并呈现GraphViewController。
哦,你在哪里调用initWithFrame:从??看起来你可能还有两个不同的GraphView实例。尝试使用self.datasource记录'self'以检查它。