Как я могу предотвратить прокручиваемый UITableView от освобождения строк?
Моя проблема довольно проста. У меня есть UITableViewController (ну, я подклассифицировал его, но это не проблема), со статическим расположением, и он достаточно большой, чтобы не помещаться на экране одновременно.
я использую viewWithTag
чтобы получить значения пары UISwitch
Да, но они просто за кадром, так viewWithTag
в бешенстве возвращается ноль.
Честно говоря, я не знаю и не забочусь о накладных расходах памяти, оставляемых ими в памяти; не так много памяти, чтобы лежать без дела, и у меня мало времени.
Как я могу предотвратить прокрутку, вызывающую освобождение?
РЕДАКТИРОВАТЬ: я точно знаю, что не так, как объяснено выше, просто не как исправить это (мой обычный гугл-фу выдохся). Но так как вы попросили увидеть код...
int tag=200
int prefs = 0;
for (int i=0; i != 3; ++i) // There are only 3 preferences
{
prefs = prefs << 1;
UISwitch *swt = (UISwitch *)[self.view viewWithTag:tag + i];
NSLog(@"%@", swt);
if ([swt isOn])
++prefs;
NSLog(@"%d", prefs);
}
Приведенный выше код работает в viewDidAppear (поскольку переключатели находятся в верхней части таблицы), но не один раз, когда я прокрутил до нижней части таблицы (viewWithTag возвращает ноль).
3 ответа
Если вы используете UITableView, то это абсолютно не так, как он работает.
Для UITableView реализуйте numberOfRowsInSection и cellForRowAtPathIndex, а когда вы хотите изменить одну из ячеек, вызовите reloadRowsAtIndexPath.
Все объекты ваших клеток доступны и не уничтожены ни на экране, ни за его пределами. TableView просто повторно использует ячейку.
Следовательно, вы можете получить объект любой ячейки:
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:<requiredIndexPath>];
// Check the status of your cell's switch.
Переберите все ячейки tableView, и вы получите его. Ознакомьтесь с документацией Apple.
Если вы хотите получить доступ к коммутатору, вы должны получить доступ к объекту, который вы передаете источнику данных. Там вы можете получить доступ к значению переключателя.
Я думаю, что вы пытаетесь сделать настройку в tableView. Вот что я обычно делаю
// create an array to hold the setting data
NSArray *settingArray = @[@{@"title":@"Frequently Asked Questions"},@{@"title":@"Need Help?"},@{@"title":@"Push Notification",@"hasSwitch":[NSNumber numberWithBool: YES],@"switchValue":[[NSUserDefaults standardUserDefaults]boolForKey:@"kPushPreference"]}];
// data source
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.settingsArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
SettingCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SettingCell" forIndexPath:indexPath];
NSDictionary *dictionary = self.settingsArray[indexPath.row];
[cell.settingName setText:dictionary[@"title"]];
if (dictionary[@"hasSwitch"]) {
[cell.settingSwitch setHidden:NO];
[cell.settingSwitch setOn:dictionary[@"switchValue"]];
}
return cell;
}
`