我在Storyboard工作,但我认为现在是时候面对代码......
我的服务器上有一个PHP文件,它将我的MySQL数据库表的内容输出为JSON格式的数组:
{
"id":"2",
"name":"The King's Arms",
"city":"London",
"day":"Tuesday",
}
我最终需要所有数据,但是现在我只想将城市字段输出为UITableView。我该怎么做呢?
答案 0 :(得分:18)
我相信在2012/2013这一年,Apple在代码实践方面涵盖了一个精彩的视频,突出显示的一个子主题是处理JSON对象和为它们创建数据对象的一种很好的智能方法。对不起,我忘记了实际视频的名称,如果有人记得,请为我编辑答案。
苹果所涵盖的是拥有存储每个json对象的数据对象。然后,我们将创建一个数组来存储这些对象,并在填充tableView时适当地访问所需的字段。所以在你的情况下你会做这样的事情。
在项目导航器中添加NSObject类型的文件并添加以下代码:
#import <Foundation/Foundation.h>
@interface PlaceDataObject : NSObject
-(id)initWithJSONData:(NSDictionary*)data;
@property (assign) NSInteger placeId;
@property (strong) NSString *placeName;
@property (strong) NSString *placeCity;
@property (strong) NSString *placeDay;
@end
并在您的.m
文件中添加此代码
#import "PlaceDataObject.h"
@implementation PlaceDataObject
@synthesize placeId;
@synthesize placeName;
@synthesize placeCity;
@synthesize placeDay;
-(id)initWithJSONData:(NSDictionary*)data{
self = [super init];
if(self){
//NSLog(@"initWithJSONData method called");
self.placeId = [[data objectForKey:@"id"] integerValue];
self.placeName = [data objectForKey:@"name"];
self.placeCity = [data objectForKey:@"city"];
self.placeDay = [data objectForKey:@"day"];
}
return self;
}
@end
您现在拥有的是一个数据对象类,您可以在代码中的任何位置使用它,并获取您所显示的任何表的相应详细信息,无论是city
字段表还是{{1通过执行此操作,您还可以避免在项目中的任何位置使用json解码代码。当“钥匙”的名称发生变化时会发生什么?您只需转到city and name
课程并更改适当的PlaceDataObject
,而不是通过代码修正所有密钥,而您的应用程序将继续有效。
“模型对象代表了特殊的知识和专业知识。它们保存应用程序的数据并定义操纵该数据的逻辑。精心设计的MVC应用程序将其所有重要数据封装在模型对象中......它们代表与特定问题领域相关的知识和专业知识,往往是可重复使用的。“
使用自定义对象为服务器中的每个json条目填充数组
现在填充您已制作的此自定义数据对象的数组。现在遵循MVC方法,您可能最好拥有处理不同类(Model类)中的数据的所有方法。这就是Apple建议将这些方法放在一个单独的模型类中,其中所有处理都会发生。
但是现在我们只是为了演示目的而将下面的代码添加到View Controller中。
在视图控制器的m文件中创建一个处理JSON数组的方法。
key
您可以这样调用上述方法:
//make sure you have a global NSMutableArray *placesArray in your view controllers.h file.
-(void)setupPlacesFromJSONArray:(NSData*)dataFromServerArray{
NSError *error;
NSMutableArray *placesArray = [[NSMutableArray alloc] init];
NSArray *arrayFromServer = [NSJSONSerialization JSONObjectWithData:dataFromServerArray options:0 error:error];
if(error){
NSLog(@"error parsing the json data from server with error description - %@", [error localizedDescription]);
}
else {
placesArray = [[NSMutableArray alloc] init];
for(NSDictionary *eachPlace in arrayFromServer)
{
PlaceDataObject *place = [PlaceDataObject alloc] initWithJSONData:eachPlace];
[placesArray addObject:place];
}
//Now you have your placesArray filled up with all your data objects
}
}
使用自定义数据对象填充tableView
至于在TableView中填充数据,你可以这样做:
//This is not what your retrievedConnection method name looks like ;)
// but you call the setupPlacesFromJSONArray method inside your connection success method
-(void)connectionWasASuccess:(NSData *)data{
[self setupPlacesFromJSONArray:data];
}
简短免责声明:上述代码尚未经过测试,但如果一切正常或我遗漏了任何字符,请告诉我。
答案 1 :(得分:1)
如果来自服务器的原始数据到达NSData对象,则可以使用NSJSONSerialization类为您解析它。
那是:
NSError *error;
NSMutableArray *cityArray = [[NSMutableArray alloc] init];
NSArray *arrayFromServer = [NSJSONSerialization JSONObjectWithData:dataFromServer options:0 error:error];
if(arrayFromServer)
{
NSLog(@"error parsing data - %@", [error localizedDescription]);
} else {
for(NSDictionary *eachEntry in arrayFromServer)
{
NSString *city = [eachEntry objectForKey:@"city"];
[cityArray addObject: city];
}
}
完成填充城市数组后,您可以在表格视图的数据源方法中返回:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1; // your table only has one section, right?
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if(section == 0)
{
return([cityArray count]);
}
NSLog(@"if we're at this place in the code, your numberOfSectionsInTableView is returning something other than 1");
return 0;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// are you using standard (default) cells or custom cells in your storyboard?
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
if(cell)
{
cell.text = [cityArray objectAtIndex:indexPath.row];
}
return(cell);
}
答案 2 :(得分:0)
什么是myCitysTable,Paven?是假设是TableView的名称?我正在努力弄清楚如何命名,如果是这样的话......