如何防止可滚动的UITableView取消分配行?

时间:2015-04-22 09:09:25

标签: ios objective-c uitableview viewwithtag

我的问题非常简单。 我有一个UITableViewController(好吧,我将其子类化,但这不是问题),静态布局,并且它足够大,一次不适合屏幕。

我正在使用viewWithTag来检索一对UISwitch es的值,但它们只是在屏幕外,所以viewWithTag正在真正地返回nil。

坦率地说,我既不知道也不关心将它们留在内存中的内存开销;离开时并没有多少记忆,我的时间很短。

如何阻止滚动触发释放?

编辑:我确切地知道出了什么问题,正如上面解释的那样,不知道如何解决它(我通常的google-fu干了)。但既然你要求查看代码......

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返回null)。

3 个答案:

答案 0 :(得分:0)

无论是在屏幕上还是在屏幕外,您的单元格的所有对象都可用,并且不会被破坏。 TableView只是重用了单元格。

因此,您可以通过以下方式获取任何单元格的对象:

UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:<requiredIndexPath>];
// Check the status of your cell's switch.

循环遍历tableView的所有单元格,你就可以得到它 看看documentation by Apple

答案 1 :(得分:0)

如果您使用的是UITableView,那么这绝对不是它的工作原理。

对于UITableView,实现numberOfRowsInSection和cellForRowAtPathIndex,当您想要更改其中一个单元格时,请调用reloadRowsAtIndexPath。

答案 2 :(得分:0)

如果要访问交换机,则应访问传递给数据源的对象。在那里你可以访问开关值。

我认为您正在尝试在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;
}

`