iPhone xcode массив теряет состояние после загрузки - PullRequest
1 голос
/ 08 апреля 2010

Точно, у меня был поиск вокруг, и я ничего не могу найти.

@synthesize list; // this is an NSArry

-(void) viewDidLoad {
   NSArray *arr = [self getJSONFeed];
   self.List = [arr retain];     // if i copy the access code into here it works fine.
}

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSUInteger row = [indexPath row];
    NSArray *vals = [list objectAtIndex:row] retain];
    NSString *id = [vals valueForKey:@"id"]; // ERROR
}

Правильно, я взял часть кода, чтобы попытаться сделать его как можно более простым, игнорировать опечатки и утечки памяти.

Обычно, когда я выбираю строку, я не могу получить данные из моего объекта массива list. Пожалуйста, кто-нибудь может мне помочь?


Это мой полный код

Я использую http://code.google.com/p/json-framework/ для моего JSON соединения

мой Json возвращается в следующем формате:

[
    {
        "id": "7812",
        "title": "title1",
        "fulltext": "main body text",
        "created": "2010-04-06 11:30:03"
    },
    {
        "id": "7813",
        "title": "title2",
        "fulltext": "main body text2",
        "created": "2010-04-06 11:30:03"
    }
]

MainNewsController.h

здесь заявляют:

NSArray *list:   
@property (nonatomic, retain) NSArray *list;

MainNewsController.m

@synthesize list;

-(void) viewDidLoad {
    NSArray *array =  [[NSArray alloc] initWithArray: [self downloadPublicJaikuFeed]];
    self.list = array;    
    NSArray *stream = [list objectAtIndex:6]; // can change index and it's fine
    NSString *vall = [stream valueForKey:@"title"]; // works fine    
    NSString *val1l = [stream valueForKey:@"id"]; // works fine
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [self.list count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *MainNewsCellIdentifier = @"MainNewsCellIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: MainNewsCellIdentifier];    
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier: MainNewsCellIdentifier] autorelease];
    }
    NSUInteger row = [indexPath row];
    NSDictionary *stream = (NSDictionary *) [list objectAtIndex:row];
    cell.textLabel.text = [stream valueForKey:@"id"];
    cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
    [stream release];
    return cell;
}

#pragma mark -    
#pragma mark Table Delegate Methods

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (childController == nil)    
        childController = [[MainNewsDetailController alloc] initWithNibName:@"DisclosureDetail" bundle:nil];
    childController.title = @"News Detail Button Pressed";    
    NSUInteger row = [indexPath row];
    NSArray *stream = (NSArray *) [self.list objectAtIndex:row];
    NSString *vall = [stream valueForKey:@"title"]; // error
    NSString *val1l = [stream valueForKey:@"id"]; // error
    childController.message = @"111";
    childController.title = @"222";
    [self.navigationController pushViewController:childController animated:YES];
}

Ответы [ 5 ]

0 голосов
/ 28 февраля 2012

Кроме того, обратите внимание, что JSON иногда возвращается как различные структуры, если элементов меньше, чем вы ожидаете.Например, если появилось два словаря, вы можете получить массив, но если он только один, это просто структура ключ / значение (словарь).Я видел случаи, когда возвращается нулевой результат, он может вернуть пустую строку ("").

0 голосов
/ 28 марта 2011

Я сомневаюсь, vals это массив.Основываясь на примере, который вы показали как пример JSON, это должен быть словарь.

NSDictionary *vals = [list objectAtIndex:row];

Кроме того, вам не нужно использовать retain для переменной, которая размещается и используется только внутри области действия.;

И почему вы не используете:

NSString *id = [vals objectForKey:@"id"];

Чтобы получить что-то из объекта словаря, вы используете objectForKey, а не valueForKey.valueForKey используется для других целей, связанных с преобразованием объекта для другого использования

0 голосов
/ 08 апреля 2010

Похоже, вы пытаетесь читать объекты из массива, используя кодирование значения ключа, которое не будет работать (по крайней мере, оно не будет работать так, как вы ожидаете).Если объект, который вы получаете в этой позиции, на самом деле является массивом, вам необходимо получить доступ к элементам с помощью objectAtIndex:.

. Попробуйте установить точку останова на линии NSString *id = [vals valueForKey:@"id"]; и проверить значения, чтобы увидеть, является ли этот объект исодержит то, что вы ожидаете.

0 голосов
/ 08 апреля 2010

Заканчивается на здесь .

и обнаружил, что NSСFArray является подклассом NSMutable Array

, поэтому, когда я изменил NSArray List на NSMutableArray, он появляетсяна работу.

0 голосов
/ 08 апреля 2010

Возможно, вам следует попробовать следующее (создать временный массив, передать его методу свойства и впоследствии освободить его):

 NSArray *arr = [[NSArray alloc] initWithArray:[self getJSONFeed]];
 self.list = arr;
 [arr release];

Убедитесь, что вы установили свойство для списка NSArray с помощью (nonatomic, retain) или (nonatomic, copy). Также вы должны освободить список NSArray в методе dealloc этого класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...