从方法中访问实例变量

时间:2012-10-01 16:59:52

标签: ios xcode

程序目标:在viewController上输入数字。当用户点击“提交”按钮时,用户输入的数据将传递到另一个类,以便在另一个viewController上显示。

问题:我试图在实例方法(numberList)中访问实例变量(-(void)insertNewNumber:(Numbers *)tempNumber),但它从未给我正确的输出。但是当我通过UITableViewDataSource的协议方法访问同一个变量时,我得到了正确的答案。我通过在实例方法和协议方法中使用NSLog来解决这个问题。

由于我已将numberList声明为property变量,因此我认为我可以从程序中的任何位置访问它并获取存储在其中的正确值。但是,当从实例方法调用NSLog语句时,编译器返回0。当NSLog语句来自协议方法时,显示正确的结果。

请帮助我理解为什么会发生这种情况,如何从程序中的任何方法将元素添加到数组中。

谢谢!

以下是我正在处理的相关代码:

Numbers.h:

@interface Numbers:NSObject

@property (strong, retain) NSString *ID;
@property (strong, retain) NSInteger *number;

@end

Numbers.m

@implementation Numbers

@synthesize ID, number;

@end

DisplayNumbers.h

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

@interface DisplayNumbers : UIViewController <UITableViewDataSource, UITableViewDelegate>

@property (strong, nonatomic) NSMutableArray *numberList;

- (void)insertNewNumber:(Numbers *)tempNumber;

@end

DisplayNumbers.m:

@implementation DisplayNumbers

@synthesize numberList;


- (void)viewDidLoad
{
    [super viewDidLoad];

    numberList = [[NSMutableArray alloc] init]; 

    Numbers *num0 = [[Numbers alloc] init];
    Numbers *num1 = [[Numbers alloc] init];

    num0.ID = [NSString stringWithFormat:@"ID 0"];
    num0.number = 1111111111;

    num1.ID = [NSString stringWithFormat:@"ID 1"];
    num0.number = 2222222222;


    [numberList addObject:num0];    
    [numberList addObject:num1];    

}

- (void)insertNewNumber:(Numbers *)tempNumber
{
    NSLog(@"numberList.count (in -(void)insetNewNumber) = %d", numberList.count);
    [numberList addObject:tempNumber];
    NSLog(@"numberList.count (in -(void)insetNewNumber) = %d", numberList.count);
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSLog(@"numberList.count (in -(NSInteger)tableView:...) = %d", numberList.count);            
    Numbers *temp = [[Numbers alloc] init];
    temp.ID = @"hi";
    temp.Number = 1234;

    [numberList addObject:temp];

    NSLog(@"numberList.count (in -(NSInteger)tableView:...) = %d", numberList.count);                
   return numberList.count;
}

@end

编辑1:呼叫insertNewNumber:。 这个方法是从另一个类调用的。

InputNumber.h:

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

@interface InputNumber:UIViewController

@property (retain, strong) NSInteger *enteredNumber;
-(void)enteredNumber;

@end

InputNumber.m

@implementation InputNumber

@synthesize enteredNumber;
-(void)enterNumber
{
    DisplayNumber *temp = [[DisplayNumber alloc] init];
    [temp insertNewNumber:enteredNumber];
}
@end   

2 个答案:

答案 0 :(得分:0)

由于您使用ViewDidLoad方法分配了numberList,因此请务必在调用insertNewNumber 后调用ViewDidLoad方法

我相信

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    Numbers *temp = [[Numbers alloc] init];
    temp.ID = @"hi";
    temp.Number = 1234;
    [self insertNewNumber:temp];
   return contactList.count;
}

有效,对吧?

如果您需要在致电insertNewNumber之前调用ViewDidLoad方法,请分配您的号码列表

numberList = [[NSMutableArray alloc] init]; 

在重载的initWithNibName:bundle:方法中。

答案 1 :(得分:0)

您的代码没有名为numberList的ivar。您需要像这样调用该属性:

self.numberList = [NSMutableArray array];

无需分配/ init,因为您已经使用了强引用。

每当您引用该numberList个对象时,都需要使用self.numberList

[self.numberList addObject:num0];
[self.numberList addObject:num1];