UISegmentedControl不取消选择旧段

时间:2014-10-25 22:12:41

标签: ios objective-c uitableview uisegmentedcontrol

我在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;

enter image description here

以下是在段选择上调用的方法:

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

3 个答案:

答案 0 :(得分:0)

奇怪的错误 - 我以前从未见过这个。两个建议:

  • 尝试在处理程序中重新设置selectedSegmentIndex,然后
  • 也可以尝试在控件上调用setNeedsDisplay
默认情况下,

momentaryNO,因此您无需进行设置。

另外,在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];