我很难用json feed dates字段填充tableview单元格。我认为这与我获取日期的方式有关
NSMutableArray *datesArray = [[NSMutableArray alloc] init];
for (NSDictionary *tempDict in json){
[datesArray addObject:[tempDict objectForKey:@"date"]];
}
如果可以,请提供帮助。我已经完成了我能想到的一切(仍然在学习)。
.h文件
#import <UIKit/UIKit.h>
@interface AvailabilityViewController : UIViewController <UITextFieldDelegate, UITableViewDelegate, UITableViewDataSource>
{
NSDate *appointmentdate;
UIActionSheet *dateSheet;
UITextField *mydatetextfield;
UILabel *pastDateLabel;
NSArray *json;
}
//-(IBAction)getDataFromJson:(id)sender;
@property (strong, nonatomic) IBOutlet UITextField *mydatetextfield;
@property (nonatomic, retain) NSDate *appointmentdate;
@property (strong, nonatomic) IBOutlet UILabel *pastDateLabel;
@property (strong, nonatomic) IBOutlet UITableView *_tableView;
@property (nonatomic, retain) NSArray *json;
//-(void)setDate;
-(void)dismissDateSet;
-(void)cancelDateSet;
@end
.m文件
- (void)fetchedData:(NSData *)responseData {
//parse out the json data
NSError* error;
//NSLog(@"string is %@", responseData);
self.json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];
NSLog(@"string is %@", responseData);
if ([json isKindOfClass:[NSArray class]]) {
NSLog(@"its an array");
} else if ([json isKindOfClass:[NSDictionary class]]) {
NSLog(@"its a dictionary");
} else if ([json isKindOfClass:[NSString class]]) {
NSLog(@"its a string");
} else if ([json isKindOfClass:[NSNumber class]]) {
NSLog(@"its a number");
} else if ([json isKindOfClass:[NSNull class]]) {
NSLog(@"its a null");
} else if (json == nil){
NSLog(@"nil");
}
//NSArray* latestLoans = [json objectForKey:@"date"]; //2
NSMutableArray *datesArray = [[NSMutableArray alloc] init];
for (NSDictionary *tempDict in json){
[datesArray addObject:[tempDict objectForKey:@"date"]];
}
NSLog(@"this is your datesArray %@", datesArray);
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
return self.json.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.textLabel.text = [[self.json objectAtIndex:indexPath.row] objectForKey:@"date"];
return cell;
//[_tableView reloadData];
}
这是我的dateLogr
的NSLog2012-08-21 10:09:39.303 GBSB[1409:15b03] this is your datesArray (
"2012-08-13 12:00:00",
"2012-08-13 10:00:00",
"2012-08-13 13:00:00"
这是viewDidLoad的样子
- (void)viewDidLoad
{
[super viewDidLoad];
dispatch_async(kBgQueue, ^{
NSData* data = [NSData dataWithContentsOfURL:
kLatestKivaLoansURL];
[self performSelectorOnMainThread:@selector(fetchedData:)
withObject:data waitUntilDone:YES];
});
}
- (void)fetchedData:(NSData *)responseData {
//parse out the json data
NSError* error;
//NSLog(@"string is %@", responseData);
self.json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];
NSLog(@"string is %@", responseData);
if ([json isKindOfClass:[NSArray class]]) {
NSLog(@"its an array");
} else if ([json isKindOfClass:[NSDictionary class]]) {
NSLog(@"its a dictionary");
} else if ([json isKindOfClass:[NSString class]]) {
NSLog(@"its a string");
} else if ([json isKindOfClass:[NSNumber class]]) {
NSLog(@"its a number");
} else if ([json isKindOfClass:[NSNull class]]) {
NSLog(@"its a null");
} else if (json == nil){
NSLog(@"nil");
}
//NSArray* latestLoans = [json objectForKey:@"date"]; //2
NSMutableArray *datesArray = [[NSMutableArray alloc] init];
for (NSDictionary *tempDict in json){
[datesArray addObject:[tempDict objectForKey:@"date"]];
}
NSLog(@"this is your datesArray %@", datesArray);
NSLog(@"this is the json %@", self.json);
// Uncomment the following line to preserve selection between presentations.
// self.clearsSelectionOnViewWillAppear = NO;
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem;
}
答案 0 :(得分:3)
您正在fetchedData方法中创建一个名为json的局部变量,并将解析后的响应放在那里。但是,因为这是一个局部变量,所以一旦退出方法,它就不再存在。
相反,您应该做的是将解析后的响应数据放入您在.h文件中声明的viewController的json
@property中。为此,请对fetchedData:
方法进行此更改:
self.json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];
然后在cellForRowAtIndexPath:
中,你可以提取出这样的数据:
cell.textLabel.text = [[self.json objectAtIndex:indexPath.row] objectForKey:@"date"]
您的numberOfRowsInSection:
也应该返回:
return self.json.count;
编辑:
关于局部变量与ivars与属性的更多解释......
在.h文件中的视图控制器的@interface中声明这个:
NSArray *json;
您正在为您的班级创建实例变量(ivar)。每当实例化一个类的实例时,它将有一个名为json
的成员变量,您可以在类的方法中访问它。
当您声明这样的属性时:
@property (nonatomic, retain) NSArray *json;
并在实现文件中匹配@synthesize:
@synthesize json;
编译器会自动为您生成setter和getter方法,因此您可以使用以下方法:
NSArray *theArray = [self json]; // getter
[self setJson:newArray]; // setter
您可以使用点表示法在现代Objective-C中执行相同的操作:
NSArray *theArray = self.json; // getter
self.json = newArray; // setter
您的财产最终由一个ivar支持,该ivar默认名称与该属性相同,并且如果它不存在,将自动生成。 (您也可以在@synthesize语句中指定支持ivar的名称,并且您经常会看到人们使用以下划线开头的ivar名称来帮助保持ivar名称和属性名称是什么,但是我这里不再赘述了)
您的对象的属性可以从其他类访问,而您的对象的ivars不能。
但回到你的问题。除了ivar和property之外,您还在json
方法中创建了一个名为fetchedData:
的局部变量。由于您在方法体内声明它,因此只有在方法完成之后才会存在此变量,此时它将被释放,如果不在其他地方保留,则包含的数据将丢失。因为你给你的局部变量和你的ivar同名,所以局部变量有效隐藏了ivar。
Apple建议不要直接使用ivars,而是通过类属性(getter和setter方法)进行所有访问。这就是我建议使用self.json
的原因。它还应该解决您的问题,因为保存到您的属性的值将持续超出方法的执行。
希望有所帮助。
答案 1 :(得分:0)
看起来'json'是NSDictionary的数组。
你不能这样做:
cell.textLabel.text = [json objectAtIndex:indexPath.row];
(即将NSDictionary分配给UILabel的文本字段)
但你可以这样做:
cell.textLabel.text = [[json objectAtIndex:indexPath.row] objectForKey:@"date"];