2015-07-06 2 views
2

Так что я, кажется, провел последние пару дней, пытаясь найти для этого различные решения, и решил, что, наверное, лучше всего, что я просто спрошу кого-то. Я использую раскадровку, и я посылаю массив из одного ViewController в другой только отлично. Но однажды в этом SecondViewController у меня возникла проблема с этим. Затем я хотел бы иметь доступ к массиву в подзаголовке этого контроллера представления, чтобы иметь возможность рисовать график с данными, но всякий раз, когда я пытаюсь, я всегда получаю нуль от кода в подзапросе, хотя он определенно находится в ParentViewController , Может кто-то, пожалуйста, взгляните на мой текущий код и дайте мне знать, как я получу эти данные в своем подзаголовке.Извлечь массив из контроллера родительского просмотра в подвале

ParentViewController.h

#import <UIKit/UIKit.h> 
#import "GraphView.h" 
#import "Model.h" 
@interface GraphViewController : UIViewController 
@property (strong) Model *model; 
@property (weak) GraphView *graph; 
@property (strong) NSArray *data; 
@end 

ParentViewController.m

#import "GraphViewController.h" 

@interface GraphViewController() 

@end 

@implementation GraphViewController 
@synthesize graph; 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
    NSLog(@"Model data: %@",self.data);//prints just fine 
[self.graph setNeedsDisplay]; 
} 

- (void)didReceiveMemoryWarning { 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 

SubView.h

#import <UIKit/UIKit.h> 
#import "Model.h" 
@interface GraphView : UIView 
@property (weak) NSArray *array; 
@property (strong) Model *model; 
@end 

Subview.m

#import "GraphView.h" 
#import "GraphViewController.h" 
@implementation GraphView 
- (id)initWithFrame:(CGRect)frame dataArray:(NSArray*)data { 
    self = [super initWithFrame:frame]; 
    if (self) { 
    // Initialization code 
    } 
return self; 
} 
- (void)drawRect:(CGRect)rect { 
    // Drawing code 
    NSLog(@"Draw Rect"); 
    NSLog(@"%@", self.array);//The bit that keeps returning null 
    if (self.array != nil){ 
     NSLog(@"Drawing Rect"); 
     CGContextRef ctx = UIGraphicsGetCurrentContext(); 
     CGContextBeginPath(ctx); 
     CGContextMoveToPoint(ctx, 160, 100); 
     CGContextAddLineToPoint(ctx,260,300); 
     CGContextAddLineToPoint(ctx,60,300); 
     CGContextClosePath(ctx); 
     [[UIColor blueColor] setFill]; 
     [[UIColor greenColor] setStroke]; 
     CGContextSetLineWidth(ctx,2.0); 
     CGContextDrawPath(ctx,kCGPathFillStroke); 
    } 

} 

Теперь я знаю, что он будет возвращать нуль сейчас, потому что я на самом деле не назначая его к чему-либо, но я попытался так много различных способов, чтобы пытаться присвоить его в массив данных в контроллере родительского представления я забыл, как я даже начал. Любая помощь приветствуется!

+0

Где вы настройки вида в 'ParentViewController'? Кроме того, насколько мне известно, вам не нужно «setNeedsDisplay» в родительском элементе. – JaredH

+0

Вид устанавливается с помощью конструктора интерфейса, а затем устанавливается в класс. Затем делается ссылка на график @property (слабый) GraphView *; Этот стиль настройки работает для меня с другими представлениями, хотя эти представления в моем приложении не нуждаются в массиве, отправляющем их – cjbatin

ответ

1

Присвоить GraphView данные в viewDidLoad. Также убедитесь, что ваш self.graph правильно подключен/инициализирован.

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
    NSLog(@"Model data: %@",self.data);//prints just fine 
    self.graph.array = self.data; 
    [self.graph setNeedsDisplay]; 
} 
+0

Нет, жаль, что это тоже не работает, self.graph.data не существует, и если вы имели в виду .graph.array, который также будет возвращать нуль – cjbatin

+0

Я отредактировал свой ответ, также вы можете подтвердить, является ли ваше «я».graph 'is' non-nil', потому что я не вижу, как он выделяется (code/xib) –

+0

О, кажется, мой взгляд возвращает nil, я установил его, хотя создатель интерфейса, как я это сделал для других просмотров я не совсем уверен, почему он возвращает нуль для этого представления, а не мои другие. – cjbatin

0

Существует 3 проблемы в вашем коде:

  1. @property (слабый) GraphView * график; // график слаб, объект будет освобожден после назначения.
  2. Отсутствует назначение для self.array в GraphView.
  3. Не добавлен график в список контроллеров.view.subviews.

Вот мой код:

@interface GraphViewController : UIViewController 

@property (strong) Model *model; 
@property (retain) GraphView *graph; // change to retain 
@property (strong) NSArray *data; 
@end 

@implementation GraphViewController 

@synthesize graph; 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 

    self.data = [[NSArray alloc] initWithObjects:@1, @2, nil]; 

    self.graph = [[GraphView alloc] initWithFrame:CGRectMake(0, 0, 320, 320) dataArray:self.data]; 

    [self.view addSubview:self.graph]; // Init graph and add into subviews. 
} 
@end 

@interface GraphView : UIView 

- (id)initWithFrame:(CGRect)frame dataArray:(NSArray*)data; 

@property (weak) NSArray *array; 
@property (strong) Model *model; 
@end 

@implementation GraphView 

- (id)initWithFrame:(CGRect)frame dataArray:(NSArray*)data { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 

     self.array = data; // Assign the array. 
    } 
    return self; 
} 
- (void)drawRect:(CGRect)rect { 
    // Drawing code 
    NSLog(@"Draw Rect"); 
    NSLog(@"%@", self.array);//The bit that keeps returning null 
    if (self.array != nil){ 
     NSLog(@"Drawing Rect"); 
     CGContextRef ctx = UIGraphicsGetCurrentContext(); 
     CGContextBeginPath(ctx); 
     CGContextMoveToPoint(ctx, 160, 100); 
     CGContextAddLineToPoint(ctx,260,300); 
     CGContextAddLineToPoint(ctx,60,300); 
     CGContextClosePath(ctx); 
     [[UIColor blueColor] setFill]; 
     [[UIColor greenColor] setStroke]; 
     CGContextSetLineWidth(ctx,2.0); 
     CGContextDrawPath(ctx,kCGPathFillStroke); 
    } 
} 
@end 
Смежные вопросы