0

我的问题很简单。我有一个 UITableViewController(好吧,我把它子类化了,但这不是问题),它有一个静态布局,而且它足够大,不能一次全部放在屏幕上。

viewWithTag用来检索几个UISwitches 的值,但它们就在屏幕外,所以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)就不行了。

4

3 回答 3

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;
}

`

于 2015-04-22T09:35:19.557 回答
0

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

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

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

循环遍历 tableView 的所有单元格,你会得到它 看看Apple 的文档

于 2015-04-22T09:24:21.170 回答
0

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

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

于 2015-04-22T09:25:25.187 回答