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

Ios 如何防止可滚动UITableView取消分配行?,ios,objective-c,uitableview,viewwithtag,Ios,Objective C,Uitableview,Viewwithtag,我的问题很简单。 我有一个UITableViewController(嗯,我对它进行了子类化,但这不是问题所在),它有一个静态布局,而且它足够大,不能同时在屏幕上显示所有内容 我正在使用viewWithTag检索一对UISwitches的值,但它们刚刚从屏幕上消失,因此viewWithTag令人恼火地返回nil 坦白地说,我既不知道也不关心把它们留在记忆中的内存开销;躺在那里没有太多的记忆,我的时间也不够 如何防止滚动触发解除分配 编辑:如上所述,我确切地知道问题出在哪里,只是不知道如何解决(我

我的问题很简单。 我有一个UITableViewController(嗯,我对它进行了子类化,但这不是问题所在),它有一个静态布局,而且它足够大,不能同时在屏幕上显示所有内容

我正在使用
viewWithTag
检索一对
UISwitch
es的值,但它们刚刚从屏幕上消失,因此
viewWithTag
令人恼火地返回nil

坦白地说,我既不知道也不关心把它们留在记忆中的内存开销;躺在那里没有太多的记忆,我的时间也不够

如何防止滚动触发解除分配

编辑:如上所述,我确切地知道问题出在哪里,只是不知道如何解决(我通常的谷歌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);
}
int标记=200
int-prefs=0;
对于(int i=0;i!=3;++i)//只有3个首选项
{

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

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

UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:<requiredIndexPath>];
// Check the status of your cell's switch.
UITableViewCell*cell=[self.tableView cellForRowAtIndexPath:];
//检查手机开关的状态。
循环遍历tableView的所有单元格,您将得到它
看看

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


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

如果您想要访问开关,您应该访问传递给数据源的对象。在那里您可以访问开关值

我想你是想在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;
}

`

开关放在哪里?将代码粘贴到这里,这可能有助于我们理解问题!使用适当的变量名而不是缩写不会使代码运行得更慢。您试图做的是糟糕的设计模式:您不应该使用视图组件来存储数据-只用于显示数据。我建议使用variables表示您通过
UISwitch
显示的值,并使它们与您的
UISwitch
@JakubVano保持同步。我没有问这是否是一个好的设计模式。我知道如何使用事件处理程序。我只知道这需要我重写一堆代码,而不是重写。此外,数据是在视图中准备就绪。当用户向后滚动时,开关处于相同的位置。因此它被存储在某个地方。我只希望该存储可用,而不是重复。@gnasher729
prefs-->首选项
swt-->开关
、和
I-->索引
的映射真的会让您感到困惑吗?顺便说一句,我是只有一个人必须维护它,这对我来说很清楚。我的意思是说,这些是我在过去几年中一直使用的缩写,所以我不太可能忘记它们。你不应该自己调用CellForRowatineXpath。这只会干扰TableViewController的操作。试试看,它只会返回你是所需单元格的对象。是的,当你认真使用它时,它会在你面前爆炸。因为你不应该自己调用它,它会干扰TableViewController的操作。如果他能从数据源本身监视开关状态,我更希望他使用它。我是相对的我对iOS很陌生,所以我不知道该怎么做。我没有明确声明数据源,只是放置了一个开关。
view.dataSource
会是我需要的吗?是的,你需要设置
tableView.dataSource=self
并设置协议