【发布时间】:2014-10-25 22:12:40
【问题描述】:
我在 UITableView 表行中有一个 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];
}
【问题讨论】:
-
您的表格视图是否滚动,如果是,您是否只有在滚动后才能看到这种效果?
-
tableview 可以滚动。也就是说,该元素位于顶部,并且无需滚动即可显示。测试时我没有滚动(即没有重绘行)。
-
我可以复制您的问题的唯一方法是滚动。您的代码存在的一个问题是,当您重用一个单元格时,您将在旧控制器之上添加新的分段控制器。最好创建一个子类单元格,并在其 init 方法中添加分段控件。或者,您可以在将单元格添加到 cellFroRowAtIndexPath 之前检查单元格是否包含分段控件。
-
我遇到了同样奇怪的问题。如果我将分段控件的创建放在 dispatch_async(dispatch_get_main_queue(), ^{}) 块中,结果会有所不同,但它仍然不能正确运行。我完全从头开始制作类似的控件。这确实是一个奇怪的问题。
标签: ios objective-c uitableview uisegmentedcontrol