Передача массива и строки в пользовательский класс UIView (подкласс) (iOS) - PullRequest
0 голосов
/ 01 декабря 2011

Надеюсь, вы можете помочь.

Я создал свой собственный пользовательский UIView и пытаюсь передать NSMutableArray, который я настроил, из данных из базы данных sqlite.У меня есть NSLog'd массив из ViewController, и все отображается правильно.

Однако я хочу передать этот NSMutableArray в мой пользовательский UIView (на самом деле это UIScrollView), чтобы я мог творить чудеса.Однако, когда я делаю это, мое NSLog-шоу выводится как (ноль).

Вот мой код (я также передал тестовую строку, чтобы увидеть, специфичен ли он для массива, но это не так):

viewcontroller.m (только что показан класс Custom)вызов - NSLog выводит содержимое массива (см. конец примеров)

- (void)viewDidLoad
{
...
NSString *teststring = @"Testing";
NSLog(@"Subitems: %@", subitems);
SubItemView* subitemview = [[SubItemView alloc] initWithFrame:CGRectMake(150,150,0,0)];
subitemview.cvSubitems = subitems;
subitemview.teststring = teststring;
[self.view addSubview:subitemview];
}

customview.h

#import <UIKit/UIKit.h>

@class SubItemView;

@interface SubItemView : UIScrollView {

}


@property (nonatomic, retain) NSMutableArray *cvSubitems;
@property (nonatomic, retain) NSString *teststring;

@end

customview.m

#import "SubItemView.h"

@implementation SubItemView

@synthesize cvSubitems;
@synthesize teststring;

- (id)initWithFrame:(CGRect)frame
{   
    CGRect rect = CGRectMake(0, 0, 400, 400);
    NSLog(@"Subclass Properties: %@", self.cvSubitems);
    self = [super initWithFrame:rect];

    if (self) {
        // Initialization code
    }
    return self;
}

Первый NSLog вviewcontroller.m выводит:

Subitems: (
    "<SubItems: 0x6894400>",
    "<SubItems: 0x6894560>"
)

Второй NSLog из Custom UIScrollView выводит:

Subclass Properties: (null)

Я немного новичок, поэтому я явно что-то упускаю (возможно,очевидно) здесь. Я просто очень стараюсь передать массив и даже простую строку в пользовательский класс и просто вывести его содержимое через NSLog.

Любая помощь с благодарностью.

Ответы [ 2 ]

2 голосов
/ 01 декабря 2011

Хорошо, когда вызывается ваш метод initWithFrame, ваше свойство cvSubitems еще не установлено, поскольку оно устанавливается только после вашего вызова initWithFrame.

Попытайтесь еще раз записать значение ваших массивов в метод, который вызывается после инициализации вашего представления, или предоставьте пользовательский метод init (например, initWithMyData: andFrame:) для решения этой проблемы.

1 голос
/ 01 декабря 2011

Итак, чтобы уточнить, что уже было сказано, вы звоните не по порядку.

1| SubItemView* subitemview = [[SubItemView alloc] initWithFrame:CGRectMake(150,150,0,0)];
2| subitemview.cvSubitems = subitems;
3| subitemview.teststring = teststring;
  • В строке 1 вы вызываете метод initWithFrame: для SubItemView
  • В строках 2 и 3 вы устанавливаете ivars

Дело в том, что вы устанавливаете ivars (строки 2 + 3) после возврата метода initWithFrame:.

Но вы пытаетесь напечатать ивары по методу initWithFrame:

Вы также пытаетесь зарегистрировать ивары, прежде чем даже назначить self, что тоже не очень хорошая идея

NSLog(@"Subclass Properties: %@", self.cvSubitems);
self = [super initWithFrame:rect];

Чтобы доказать, что они установлены, вы можете просто напечатать из того места, где вы их создали:

SubItemView *subitemview = [[SubItemView alloc] initWithFrame:CGRectMake(150,150,0,0)];
subitemview.cvSubitems = subitems;
subitemview.teststring = teststring;
NSLog(@"Subclass Properties: %@", subitemview.cvSubitems);
...