touchJSON дает NSInvalidException NSNull isEqualtoString: - PullRequest
1 голос
/ 08 января 2012

Здравствуйте, я новичок в Cocoa Development и пытаюсь понять, что я сделал не так.Я следовал ( учебник ), который использует touchJSON, чтобы заполнить tableView с базой данных mySQL в XCode.Когда я запускаю приложение, все работает нормально, но когда я прокручиваю tableView, я получаю ошибку 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 ]

2 голосов
/ 09 января 2012

Я предполагаю, что один из объектов, поступающих из вашей базы данных, - это 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 в вашем случае.

0 голосов
/ 09 мая 2013

Также вы можете использовать это:

Избегать сбоев объектами NSNull с NSDictionary + Проверено

- (id)verifiedObjectForKey:(id)aKey;
...