我在UITableView Table行中有一个UISegmentedControl。选择将触发,新段将突出显示。问题是,旧段仍然处于选中状态。
如果我关闭并重新打开包含该表的弹出窗口,则会显示正确的段索引。
我正在运行XCode 6.1并在iOS 7.1模拟器上进行测试。
协助表示赞赏。
UITableViewCell *segmentCell = [tableView dequeueReusableCellWithIdentifier:segmentCellIdentifier];
if (segmentCell == nil) {
segmentCell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:segmentCellIdentifier];
}
segmentCell.backgroundColor = [UIColor clearColor];
segmentCell.backgroundView = nil;
NSArray *segmentItems = [NSArray arrayWithObjects: NSLocalizedString(@"settingsBackgroundCork", @"Cork - Select cork background theme"), NSLocalizedString(@"settingsBackgroundDark", @"Dark - Select dark background theme"), NSLocalizedString(@"settingsBackgroundLight", @"Light - Select light background theme"), nil];
self.backgroundSegmentedControl = [[UISegmentedControl alloc] initWithItems: segmentItems];
[self.backgroundSegmentedControl addTarget:self action:@selector(backgroundControlChanged:) forControlEvents: UIControlEventValueChanged];
self.backgroundSegmentedControl.frame = CGRectMake(10, 6, 300, 32);
NSInteger background = [[NSUserDefaults standardUserDefaults] integerForKey:kUserDefaultsBackgroundSelection];
self.backgroundSegmentedControl.selectedSegmentIndex = background;
self.backgroundSegmentedControl.momentary = NO;
[segmentCell.contentView addSubview:self.backgroundSegmentedControl];
cellToReturn = segmentCell;
以下是在段选择上调用的方法:
- (void)backgroundControlChanged:(UISegmentedControl *)control
{
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setInteger:control.selectedSegmentIndex forKey:kUserDefaultsBackgroundSelection];
self.backgroundSegmentedControl.selectedSegmentIndex = control.selectedSegmentIndex;
[self.backgroundSegmentedControl setNeedsDisplay];
[[NSNotificationCenter defaultCenter] postNotificationName:kPageBackgroundShouldChangeNotification object:nil];
}
答案 0 :(得分:0)
奇怪的错误 - 我以前从未见过这个。两个建议:
selectedSegmentIndex
,然后setNeedsDisplay
。 momentary
为NO
,因此您无需进行设置。
另外,在selectedSegmentIndex
文档中说:
默认值为UISegmentedControlNoSegment(未选择任何片段),直到用户触摸片段。将此属性设置为-1可关闭当前选择。
也许你也想尝试这最后一件事。
答案 1 :(得分:0)
我能够通过将我对setSelectedSegmentIndex的调用移到setNeedsLayout函数内来解决这个问题,而不是在创建UISegmentedControl后立即调用它。当然,我还必须创建一个变量来跟踪应该选择哪个段。
答案 2 :(得分:0)
有同样的问题。通过在添加新实例之前从超级视图中删除segmentedControl的先前实例来解决此问题。
在将segmentedControl的新实例添加到父视图之前,添加以下3行代码以删除以前的segmentedControl。
self.backgroundSegmentedControl.tag = 101
if let foundView2 = segmentCell.contentView.viewWithTag(101) {
foundView2.removeFromSuperview()
}
[segmentCell.contentView addSubview:self.backgroundSegmentedControl];