touchJSON дает NSInvalidException NSNull isEqualtoString:
Здравствуйте, я новичок в разработке Какао, и я пытаюсь выяснить, что я сделал не так. Я следовал ( учебник), который использует touchJSON, чтобы заполнить tableView с базой данных MySQL в XCode. Когда я запускаю приложение, все работает нормально, но когда я прокручиваю таблицу, я получаю NSInvalidExeption
ошибка:
Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[NSNull isEqualToString:]: unrecognized selector sent to
instance 0x1469cd8'
Я действительно не знаю, имеет ли это какое-либо отношение к php-коду (и базе данных) или коду в Xcode.
Это мой php код:
<?php
$link = mysql_pconnect("localhost", "root", "root") or die("Could not connect");
mysql_select_db("PartyON") or die("Could not select database");
$arr = array();
$rs = mysql_query("SELECT id, Maand, Naam, Locatie, Plaats FROM tblWebData");
while($obj = mysql_fetch_object($rs)) {
$arr[] = $obj;
}
echo '{"tblWebData":'.json_encode($arr).'}';
?>
Это мой код из Xcode:
#import "GentDataView.h"
#import "CJSONDeserializer.h"
#import "GentDetailCell.h"
@implementation GentDataView
@synthesize rows, tableview;
- (void)viewDidLoad {
[super viewDidLoad];
NSURL *url = [NSURL URLWithString:@"http://localhost:8888/example3.php"]; //URL Modification
NSString *jsonreturn = [[NSString alloc] initWithContentsOfURL:url]; // Pulls the URL
// NSLog(jsonreturn); // Look at the console and you can see what the restults are
NSData *jsonData = [jsonreturn dataUsingEncoding:NSUTF32BigEndianStringEncoding];
NSError *error = nil;
// In "real" code you should surround this with try and catch
NSDictionary * dict = [[CJSONDeserializer deserializer] deserializeAsDictionary:jsonData error:&error];
if (dict)
{
rows = [dict objectForKey:@"tblWebData"];
}
NSLog(@"Array: %@",rows);
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [rows count];
}
// Customize the appearance of table view cells.
- (GentDetailCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
GentDetailCell *cell = (GentDetailCell *) [tableview dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[GentDetailCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
// Configure the cell.
NSSortDescriptor *sorteerDiscriptor = [[NSSortDescriptor alloc] initWithKey:@"id" ascending:NO];
rows = [rows sortedArrayUsingDescriptors:[NSArray arrayWithObject:sorteerDiscriptor]];
NSDictionary *dict = [rows objectAtIndex: indexPath.row];
cell.Naam.text = [dict objectForKey:@"Naam"];
cell.Plaats.text = [dict objectForKey:@"Plaats"];
cell.Maand.text = [dict objectForKey:@"Maand"];
cell.Locatie.text = [dict objectForKey:@"Locatie"];
cell.imageView.image = [NSURL URLWithString:@"http://www.iconarchive.com/show/flags-icons-by-iconscity/belgium-icon.html"];
//cell.textLabel.text = [dict objectForKey:@"post_title"];
//cell.detailTextLabel.text = [dict objectForKey:@"post_content"];
//tableView.backgroundColor = [UIColor cyanColor];
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 125;
}
@end
Как я уже сказал, я новичок в этом, поэтому любая помощь будет очень приветствоваться! Я пытаюсь разобраться в этом вопросе уже несколько дней, но не могу найти точного ответа или решения!
Большое спасибо за ваши усилия заранее!
2 ответа
Я предполагаю, что один из объектов, который исходит из вашей базы данных, NULL
в БД, будучи правильно переведенным в null
в JSON и быть правильно переведены в NSNull
в TouchJSON. Затем вы берете его из словаря и устанавливаете его как текст UILabel
,
Вы должны добавить чеки в вашем tableView:cellForRowAtIndexPath:
проверить объекты на самом деле NSString
s. Вероятно, что-то вроде:
id Naam = [dict objectForKey:@"Naam"];
if ([Naam isKindOfClass:[NSString class]]) {
cell.Naam.text = Naam;
} else {
cell.Naam.text = @"";
}
Кроме того, почему вы сортируете строки каждый раз, когда табличное представление запрашивает ячейку? Вы, вероятно, должны просто отсортировать их один раз, когда вы получите данные - т.е. в viewDidLoad
в твоем случае.
Также вы можете использовать это:
Избегайте сбоев объектами NSNull с помощью NSDictionary+Verified
- (id)verifiedObjectForKey:(id)aKey;