Цель C - правильный способ очистки и перезагрузки UITableViewController с помощью NSMutableArray - PullRequest
0 голосов
/ 14 марта 2012

У меня есть UITableViewController, который использует NSMutableArray для своего источника данных. Массив изначально заполняется в методе viewDidLoad путем вызова веб-службы для извлечения данных и заполнения NSMutableArray. Затем у пользователя есть возможность ввести критерий поиска (в UISearchBar) и нажать «Поиск», чтобы повторно запустить веб-службу и снова заполнить список таблиц. На данный момент мне нужно очистить массив и заполнить таблицу из результатов веб-службы. Мой вопрос: как правильно сделать это, не нарушая перерисовку табличного представления? Я вижу 2 варианта:

  1. Call [listArray removeAllObjects]; затем [[self tableView] reloadData]; перед повторным заполнением массива.

  2. Поскольку я ограничиваю список максимум 200 строками, инициализирую массив из 200 элементов, а затем вместо удаления и повторного добавления при выполнении поиска использую [listArray replaceObjectAtIndex: для замены каждой строки. Затем потребуется переменная int, чтобы сохранить количество возвращаемых строк и использовать это в методе «tableView numberOfRowsInSection», чтобы в табличном представлении отображалось только количество возвращенных строк.

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

Любая помощь приветствуется,

Jonathan

ОБНОВЛЕНИЕ:

Код для инициализации массива в viewDidLoad:

tableListDataArray = [[NSMutableArray alloc] init];

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

CustSuppListItem *custSuppItem = [[CustSuppListItem alloc] init];
[custSuppItem setAcCode:[jsonCustSuppRecord getStringForKey:@"acCode"]];
[custSuppItem setAcCompany:[jsonCustSuppRecord getStringForKey:@"acCompany"]];
[custSuppItem setAcContact:[jsonCustSuppRecord getStringForKey:@"acContact"]];
[custSuppItem setOsBalBase:[jsonCustSuppRecord getDoubleForKey:@"osBalBase"]];
[custSuppItem setAcAccStatus:[jsonCustSuppRecord getIntForKey:@"acAccStatus"]];                             
[tableListDataArray addObject:custSuppItem];                          
[custSuppItem release];

Массив освобождается в методе dealloc следующим образом:

[tableListDataArray release];

1 Ответ

2 голосов
/ 15 марта 2012

Я бы лично выбрал вариант 1. Вы должны просто иметь возможность использовать

[tableView reloadData]

без «я».Я считаю, что reloadData также вызовет метод cellForRowAtIndexPath. Не забудьте инициализировать NSMutableArray перед его использованием.

...