我的问题非常简单。 我有一个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)。
答案 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;
}
`