gpt4 book ai didi

iphone - UISegmentedControl 放在 tableView 标题中时行为异常

转载 作者:行者123 更新时间:2023-12-01 18:32:16 30 4
gpt4 key购买 nike

我在实现段控制时遇到了一些问题。因为我希望它是一个固定的标题,所以当我滚动时我总是可以看到它,我已经在
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
一切都很好,直到出现段控制。问题是单击段时。尽管调用了使用选择器实现的函数并且段控件具有正确的 selectedSegmentIndex,但除了最初使用
sortControl.selectedSegmentIndex = 0;viewForHeaderInSection .此 Segment 交互突出显示和不突出显示(再次按下时)。另一个奇怪的事情是,当我按下其他段时,0 处的段会突出显示。

这是 viewForHeaderInSection 的完整代码:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {

UIColor *tintColor = [UIColor colorWithRed:241.0/255 green:78.0/255 blue:35.0/255 alpha:1];



sortControl = [[UISegmentedControl alloc] initWithItems:
[NSArray arrayWithObjects:@"Distance", @"Rating", @"Name", nil]];
sortControl.segmentedControlStyle = UISegmentedControlStyleBar;

sortControl.tintColor = tintColor;
sortControl.frame = CGRectMake(20, 20, 280, 35);
sortControl.selectedSegmentIndex = 0;
[sortControl addTarget:self action:@selector(sortChanged) forControlEvents:UIControlEventValueChanged];

UIView *view=[UIView new];
view.frame = CGRectMake(0, 0, 320, 70);
view.backgroundColor =[UIColor blueColor];
[sortControl setEnabled:YES forSegmentAtIndex:0];
[sortControl setEnabled:YES forSegmentAtIndex:1];
[sortControl setEnabled:YES forSegmentAtIndex:2];


view.userInteractionEnabled = YES;

[view addSubview:sortControl];




return view;

}

最佳答案

你在这里有两种问题:
第一个是阿里软件在他之前的回复中提出的:您必须将瞬时属性设置为 NO 以避免闪烁问题。

但主要问题在于您使用

tableView:viewForHeaderInSection:
的方式。委托(delegate)方法。在这种方法中,您每次都在重新创建相同的 View ,但有两个不好的效果:
- 第一个在您的应用程序中可见:分段控件重新初始化,所选按钮设置为第一个(索引 0)
- 第二个是每次 TableView 调用该方法时都会增加内存泄漏。考虑到这个方法被表格 View 多次调用并且不受您的控制:基本上每次标题滚动到屏幕外然后重新进入时,表格都需要重新生成 View 并再次调用该方法。在您的代码上,该段已创建但从未释放,因此泄漏。

这个问题的解决方案是为 header 定义一个实例,最初将其设置为 nil,然后检查它是否为 nil。如果 nil 创建它,如果不使用之前生成的实例。
另一种可能的方法是在下面的代码中。所以创建一个静态实例并使用 GCD 的 dispatch_once 只在第一次创建分段控件。在这种情况下,您将永远不会丢失当前的控制状态,因为它将在每次 header 调用时重复使用。您还可以通过将整个 header UIView 创建移动到 dispatch_once block 中来提高性能,从而避免每次都进行额外的分配。


static UISegmentedControl *sortControl;

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {

UIColor *tintColor = [UIColor colorWithRed:241.0/255 green:78.0/255 blue:35.0/255 alpha:1];


static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sortControl = [[UISegmentedControl alloc] initWithItems:
[NSArray arrayWithObjects:@"Distance", @"Rating", @"Name", nil]];
sortControl.segmentedControlStyle = UISegmentedControlStyleBar;

sortControl.tintColor = tintColor;
sortControl.frame = CGRectMake(20, 20, 280, 35);
sortControl.selectedSegmentIndex = 0;

});

[sortControl addTarget:self action:@selector(sortChanged) forControlEvents:UIControlEventValueChanged];

UIView *view=[UIView new];
view.frame = CGRectMake(0, 0, 320, 70);
view.backgroundColor =[UIColor blueColor];
sortControl.momentary = NO;
[sortControl setEnabled:YES forSegmentAtIndex:0];
[sortControl setEnabled:YES forSegmentAtIndex:1];
[sortControl setEnabled:YES forSegmentAtIndex:2];


view.userInteractionEnabled = YES;

[view addSubview:sortControl];




return view;

}

关于iphone - UISegmentedControl 放在 tableView 标题中时行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7468430/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com