2012-03-14 2 views
0

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

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

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

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

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

Джонатан

UPDATE:

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

Просто заменив массив, тогда вызова reloadData было бы достаточно. Нет необходимости в removeAllObjects, если вы этого не хотите. Ваша ошибка, скорее всего, является результатом автореализованного массива. Можете ли вы предоставить код, объявляющий вашу переменную массива, а также способ установки значений? – Jeremy

+0

Привет, Джереми, спасибо за ответ. Я добавил код, который я использую, к моему первоначальному вопросу выше. –

ответ

2

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

[tableView reloadData] 

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

myMutableArray = [[NSMutableArray alloc] initWithCapacity:9001]; 
+0

+1 для 'reloadData'. Независимо от того, нужна ли «я» или «полезная», зависит от того, является ли «tableView» переменной или свойством. Если это свойство, имеет смысл использовать предоставленные аксессоры: '[self tableView]' или 'self.tableView'. – Caleb

Смежные вопросы