Свойство dataSource представления установлено в ноль после того, как я установил это - PullRequest
1 голос
/ 05 декабря 2011

Новое для iOS / Objective-C здесь. Я потратил много времени, пытаясь понять это, но просто не могу с этим справиться. Вот что происходит:

  • Нажмите кнопку «График» в представлении моего RootViewController
  • GraphViewController вступает во владение, имеет свойство graphView
  • Я установил в свойстве dataSource для GraphView значение self
  • Проверка self.graphView.dataSource с NSLog подтверждает, что он действительно указывает на себя
  • Когда вызывается drawRect: в GraphView, self.dataSource устанавливается в (null), где я ожидал, что он будет указывать на объект GraphViewController

Подводя итог: я создаю экземпляр свойства graphView в контроллере представления, затем устанавливаю его dataSource, но к тому времени, когда viewRect: вызывается, 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 голосов
/ 05 декабря 2011

Похоже, что экземпляр GraphViewController освобождается, что обнуляет свойство dataSource.

Итак, вы должны вернуться и посмотреть, как вы создаете и управляете этим GraphViewController. Распространенной ошибкой является создание подобного контроллера представления, затем заимствование его представления и добавление его в иерархию представления какого-либо другого контроллера представления, а затем удаление исходного контроллера представления.

Я бы посмотрел на это, и если вы не видите его там, опубликуйте код, в котором вы создаете, и представьте GraphViewController.

О, а откуда вы вызываете initWithFrame: from ?? Похоже, что вы также можете иметь два разных экземпляра GraphView. Попробуйте зарегистрировать «self» вместе с self.datasource, чтобы проверить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...