Iphone SDK: ошибка или моя логическая ошибка, табличное представление не может прокручиваться вниз?

Это случилось с перерывами

Проверьте мой код и сравните результат печати

может кто-нибудь знает, что не так с моим кодом...

1. Я загружаю данные plist с URL-адреса

    - (void)viewDidLoad {

    NSURLRequest *theRequest=[NSURLRequestrequestWithURL:[NSURLURLWithString:@"http://www.envolab.com/envotouch/ios_status_req_test.php"]
                                 cachePolicy:NSURLRequestUseProtocolCachePolicy
                                 timeoutInterval:60.0];

    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
    NSData *returnData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:nil error:nil]; 
    NSString *listFile = [[NSString alloc] initWithData:returnData encoding:NSASCIIStringEncoding];   
    plist = [listFile propertyList];
}

чем я распечатываю результат, чтобы проверить правильность данных или нет

адрес правильный, я вижу файл plist в Safari или IE

2. вот результат:

plist is :::::> 
(
        {
        category = Light;
        nodeID = 1;
        nodeName = "Living Room";
        nodeStatus = 0;
        nodeTrigger = 0;
        nodeType = "light_sw";
    },
        {
        category = Light;
        nodeID = 2;
        nodeName = Kitchen;
        nodeStatus = 0;
        nodeTrigger = 0;
        nodeType = "light_sw";
    },
        {
        category = Light;
        nodeID = 3;
        nodeName = Bedroom;
        nodeStatus = 1;
        nodeTrigger = 0;
        nodeType = "light_sw";
    }
)

ОК, этот результат соответствует файлу plist, который я создаю

Я хочу отобразить некоторые элементы в таблице

3. Далее я определяю, сколько строк мне нужно

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

Генерал, он вернет 3

4. Чем я устанавливаю данные, которые я считываю с URL-адреса, и устанавливаю в свои ячейки tableView.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"LightCell";

    LightCell0 *cell =(LightCell0 *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[LightCell0 alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }


    int i;
    for (i=0; i<[plist count]; i++) {

        //Get "nodeNAme"
        if(indexPath.row == i){
           cell.lightLocation.text =  [[[plist objectAtIndex:i] valueForKey: @"nodeName"]description];  
        //Determine each row's pic is Light On/Off from "nodeStatus"
        if ([[[plist objectAtIndex:i] valueForKey: @"nodeStatus"] intValue] == 0){
                cell.lightImageView.image = [UIImage imageNamed:@"lightOff.png"]; 
        }

        else if([[[plist objectAtIndex:i] valueForKey: @"nodeStatus"] intValue] == 1){
                cell.lightImageView.image = [UIImage imageNamed:@"lightOn.png"];
                cell.lightSwitch.on=YES;
        }   

        }
    }
    return cell;
}

Сборка и запуск -> Успешно без предупреждения

Я также получил результат, как я думаю, изображение соответствует статусу переключателя

Если nodeStatus равен 0 = свет выключен

другое это будет свет на

и количество строк равно 3

БУТТТТТТТТТТТ !!!!!

Когда я прокручиваю вид вниз, он вылетает без каких-либо сообщений

иногда этого не происходит, например, когда вы находитесь в верхней части таблицы

вы пытаетесь «прокрутить вверх», он автоматически прокручивает вид вниз

когда я пытаюсь прокрутить вниз, я думаю, что он вернется автоматически

но это не так!?!

Я печатаю созданную строку, она отображается так

Now you see me tableView Row Count
TOTAL PLIST ROW COUNT IS  = 3
Now you see me Load Data 0
Now you see me Load Data 1
Now you see me Load Data 2

Выглядит нормально, но я заметил одну необычную вещь

каждый раз, когда я прокручиваю вниз, случайным образом появляется еще одна строка

Now you see me Load Data 0
Now you see me Load Data 1
Now you see me Load Data 2
Now you see me Load Data 0,1,2(<-This line appear randomly with the number)

В режиме консоли вы видите только «Отладка прекращена».

Но иногда будет сообщение об ошибке:

  -[__NSCFTimer count]: unrecognized selector sent to instance 0xbb00af0
    2010-09-07 00:45:04.168 EnvoTouchDemo[3803:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 
'-[__NSCFTimer count]: unrecognized selector sent to instance 0xbb00af0'
    terminate called after throwing an instance of 'NSException'

Я удаляю программу в симуляторе и снова пересобираю, все выглядит нормально

но запустив несколько раз, он снова сбой ... и с причиной ???

Я думаю, что моя логика верна .... но авария меня действительно раздражает ....

спасибо, что прочитали мои проблемы

надеюсь, что кто-то может понять эту проблему!


person Webber Lai    schedule 06.09.2010    source источник


Ответы (1)


Вы забыли сохранить свою переменную экземпляра plist.

Если это удерживающее свойство, вы можете использовать:

self.plist = [listFile propertyList];

Если это просто переменная экземпляра, вы должны использовать:

plist = [[listFile propertyList] retain];

Возможно, это исправит ваши ошибки.

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

person Stefan Arentz    schedule 06.09.2010