iPad: проблема с UITableView - PullRequest
       0

iPad: проблема с UITableView

0 голосов
/ 10 ноября 2010

Я относительно новичок в программировании на iOS, но с небольшим опытом программирования на других языках, в основном на C # и Java.

Я пытаюсь создать нечто вроде галереи изображений с указанными категориями для какого-то продукта дляустройство iPad.Пользовательский интерфейс довольно прост и состоит из «Экран выбора» (FirstViewController, см. Ниже) и «Галерея».Экран выбора содержит 2 UITableView, master и detail, которые отображают категории продукта и подкатегории соответственно.Когда пользователь делает выбор, он нажимает «увидеть изображение» button, и изображения отображаются в режиме прокрутки в «Галерее».«Галерея» - это отдельный файл XIB, который представлен модально.Это все работает нормально.

Но странная вещь происходит, когда пользователь переключается между «Галерея» и «Экран выбора».И странно, что это происходит именно при 4-м «переключении» между ними.Я продолжаю получать сообщение:

- [FirstViewController tableView: didSelectRowAtIndexPath:]: сообщение отправлено на освобожденный экземпляр 0x4b1f9f0 "

Затем программа падает ... Яустановить NSAutoreleaseFreedObjectCheckEnabled, NSZombiesEnabled и NSDebugEnabled и все еще не более подробное описание. Даже «Guard malloc» не помогло.

Я понимаю это как некоторую проблему с памятью, но понятия не имею, почему? Отлично работает 3 раза, но не 4.

Вот та часть кода, которая вызывает проблемы:


-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    //check which table (master or detail) row is clcked then perform click event
    if( tableView.tag == 0){
        //populate list of brands using predefined function
        [self populateBrandNames:(int)indexPath.row];

        //reload data
        [detail reloadData];

        //4 a good UI experience we'll remove any previous picture loaded into brandImage
        bUserSelected = false;
        [brandImage setBackgroundImage:nil forState:UIControlStateNormal];
    }else{    //the detail table sent event
        NSIndexPath *master_row, *details_row;

        //get selected rows
        master_row = [master indexPathForSelectedRow];
        details_row = [detail indexPathForSelectedRow];

        NSString *logoName = [[NSString alloc] initWithFormat:@"%02d%02d_logo", (int)master_row.row, (int)details_row.row];
        NSString *path = [[NSBundle mainBundle] pathForResource:logoName ofType:@"jpg"];

        //check if we have path to resource (if logo exsist)
        if( path != nil ){
            UIImage *logo = [[UIImage alloc] initWithContentsOfFile:path];

            //display selected logo
            bUserSelected = true;
            [brandImage setBackgroundImage:logo forState:UIControlStateNormal];
            NSLog(@"brandImame set");

            //set current galery tag
            [currentGaleryTag setString:@""];
            [currentGaleryTag appendFormat:@"%02d%02d", (int)master_row.row, (int)details_row.row];
            [logo release];
        }else{
            NSLog(@"logo not loaded, galery tag : %@, category name : %@", logoName, [detail cellForRowAtIndexPath:details_row].textLabel.text );
        }

        [logoName release];
    }
}

Заранее спасибо!

1 Ответ

1 голос
/ 24 декабря 2010

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

Дело в том, что в этом конкретном приложении "Галерея" называется модально.Apple предполагает, что при использовании модальных представлений вызывающая сторона (основной вид, который обрабатывает отображение) также должна позаботиться об отклонении этого же представления.Лучший метод для использования в этом сценарии - это использование «специального» протокола, описывающего delegate и что-то вроде viewWillBeDismissed метода.

В моем коде это выглядит так:*

Проблема была вызвана следующей строкой:

@property (nonatomic, assign) id delegate;

«Единственное», что нужно изменить, это

@property (nonatomic, retain) id delegate;

Сохранение ссылки на делегатрешал проблему ...

Ура!

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