Как я могу предотвратить прокручиваемый 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;
}

`

Другие вопросы по тегам