2011-02-02 118 views
0

我在實例變量的iOS應用程序沒有保留價值

ViewController.h宣佈這一伊娃

#import <UIKit/UIKit.h> 

@interface FirstViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> 

{ 
NSArray *sortedCountries;  
} 

@property (nonatomic, retain) NSArray *sortedCountries; 

@end 

在ViewController.m,sortedCountries確實它在-(void)ViewDidLoad{}工作通過存儲的結果一個有序的.plist。

-(UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath {} 

在下面叫,sortedCountries返回(null)

爲什麼不sortedCountries的值保持?我在第一個函數中添加了一個retain ......我想我在這裏錯過了一個基本的Objective-C租戶。

ViewController.m

#import "FirstViewController.h" 

@implementation FirstViewController 

@synthesize sortedCountries; 

-(void)viewDidLoad { 

NSString *path = [[NSBundle mainBundle] pathForResource:@"countries" ofType:@"plist"]; 
NSArray *countries = [NSArray arrayWithContentsOfFile:path]; 
NSSortDescriptor *descriptor = [[[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES] autorelease]; 
NSArray *sortedCountries = [[countries sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]]retain]; 

} 

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

-(NSInteger)tableView:(UITableView *)tableView 
numberOfRowsInSection:(NSInteger)section { 

return 236; 
} 

-(UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

NSDictionary *country = [sortedCountries objectAtIndex:indexPath.row]; 
NSLog(@"countryDictionary is: %@",country); 
NSString *countryName = [country objectForKey:@"name"]; 
NSLog(@"countryName is : %@", countryName); 

    static NSString *CellIdentifier = @"Cell"; 

UITableViewCell *cell = 
[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) { 

    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
            reuseIdentifier:CellIdentifier] autorelease]; 

} 

cell.textLabel.text = countryName; 
return cell; 
} 

回答

3

您要重新聲明sortedCountries作爲viewDidLoad一個局部變量。用途:

sortedCountries = ... 

代替(注意沒有NSArray *)。在你現在正在使用的代碼,sortedCountries將在viewDidLoad被填充,但訪問只在viewDidLoad。您正在創建一個具有相同名稱的新變量,而不是設置類屬性。

+0

感謝詳細的解釋。 – mozzer 2011-02-03 00:53:24

6
NSArray *sortedCountries = [[countries sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]]retain]; 

self.sortedCountries = [countries sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]];