2012-10-01 198 views
0

程序目標:在viewController上輸入數字。當用戶點擊提交按鈕時,用戶輸入的數據被傳遞到不同的類,以在不同的viewController上顯示。從方法訪問實例變量

問題:我試圖訪問實例方法(-(void)insertNewNumber:(Numbers *)tempNumber)中的實例變量(numberList),但它從不給我正確的輸出。但是當我通過UITableViewDataSource的協議方法訪問相同的變量時,我得到了正確的答案。我通過使用NSLog實例方法和協議方法來解決這個問題。

由於我宣稱numberListproperty變量,我認爲我可以從程序中的任何位置訪問它並獲取存儲在其中的正確值。但編譯器在從實例方法調用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。米:

@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 
+0

你在哪個地方調用'insertNewNumber'? – sergio

+0

在[viewDidLoad]之前[insertNewNumber]是否被調用? – onnoweb

+0

@onnoweb; @sergio:謝謝你的迴應。請看看編輯1.謝謝。 –

回答

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; 
} 

作品,對不對?

如果需要調用ViewDidLoad之前打電話給你insertNewNumber方法,分配你numberList

numberList = [[NSMutableArray alloc] init]; 

在重載initWithNibName:bundle:方法。

+0

我喜歡你的方法。你能解釋一下,如何在'initWithNibName'中添加方法讓我向數組'numberList'添加一個元素? –

+0

當然。我相信你所做的就是分配你的viewController,比如MyViewController * vc = [[MyViewController alloc] initWithNibName:@「MyViewController」bundle:[NSBundle mainBundle]]; 然後你調用[vc insertNewNumber:myNumber],最後顯示你的viewController(沒有插入任何數字)。問題是viewController的viewDidLoad方法在分配時沒有被調用。因此你的numberList沒有被分配(因爲你只在viewDidLoad方法中分配它),那麼它的任何改變都是徒勞的!因此把這個分配。在initWith中將解決它 – ibanez

+0

(例如,當您將viewController的視圖添加到另一個視圖時調用viewDidLoad方法) – ibanez

0

您的代碼沒有名爲numberList的ivar。你需要這樣調用屬性:

self.numberList = [NSMutableArray array]; 

因爲您已經使用強引用,所以不需要alloc/init。

每當您提及numberList對象時,您需要使用self.numberList

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

@Simon ..謝謝你的迴應,我從中學到了一些新東西,只是爲了澄清,不是numberList ivar嗎?我通過Apple文檔瞭解'strong'參考的屬性,但是我沒有看到任何聲明,如果參考是強的,我不必alloc/init。請告訴我我在哪裏可以找到更多關於它的信息嗎?另外,我在使用'self'和'_variableName'之間感到困惑。你能解釋我的s艾米還是指點我一些鏈接?謝謝! –

+0

這並不是說如果引用很強,則不必分配/ init。由於您讓屬性處理參考,因此這樣做更好。由於您的財產已被宣佈爲強大,這意味着財產的任何分配都將被保留。與刪除引用時相同,只需將屬性清零即可。編譯器將負責爲您釋放對象。當然,所有這些都與ARC過時了,但仍然是一個很好的做法:) –

+0

好的。謝謝Simon! –