Цель C — правильный способ очистить и перезагрузить UITableViewController с помощью NSMutableArray

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

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

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

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

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

Джонатан

ОБНОВИТЬ :

Код для инициализации массива в 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];

person Jonathan Wareham    schedule 14.03.2012    source источник
comment
Достаточно просто заменить массив, а затем вызвать reloadData. Нет необходимости в removeAllObjects, если вы действительно этого не хотите. Ваша ошибка, скорее всего, связана с автоматически выпущенным массивом. Не могли бы вы предоставить код, который объявляет вашу переменную массива, а также то, как вы устанавливаете значения?   -  person Jeremy    schedule 14.03.2012
comment
Привет, Джереми, спасибо за ответ - я добавил код, который использую, к исходному вопросу выше.   -  person Jonathan Wareham    schedule 15.03.2012


Ответы (1)


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

[tableView reloadData]

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

myMutableArray  = [[NSMutableArray alloc] initWithCapacity:9001];
person Stuartsoft    schedule 14.03.2012
comment
+1 за reloadData. Нужен или полезен self, зависит от того, является ли tableView переменной или свойством. Если это свойство, имеет смысл использовать предоставленные методы доступа: [self tableView] или self.tableView. - person Caleb; 15.03.2012