如何停止 UIPickerView 的可重用性

Posted

技术标签:

【中文标题】如何停止 UIPickerView 的可重用性【英文标题】:how to stop UIPickerView reusability 【发布时间】:2013-04-23 20:08:23 【问题描述】:

我正在开发自定义 PickerView,我在选择器中有两个组件(小时、分钟),我已将分钟组件中的“0”设为灰色且不可选择,除了行是重复使用...我的 Minutes 组件以灰色字体显示“0”(这是我想要的),但如果您滚动选择器,我会看到“7、14、21 .....”全部为灰色字体!这是我的代码

enter code here
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view


if(component == HOURS) 
        NSString *s = [self.arrayOfHours objectAtIndex:row];
        return [pickerView viewForShadedLabelWithText:s ofSize:20 forComponent:0 rightAlignedAt:52 reusingView:view];

     else if (component == MINUTES) 
            NSString *s = [self.arrayOfMinutes objectAtIndex:row];
            return [pickerView viewForShadedLabelWithText:s ofSize:20 forComponent:1 rightAlignedAt:52 reusingView:view];
    
    else return 0;



  - (UIView *)viewForShadedLabelWithText:(NSString *)title ofSize:(CGFloat)pointSize forComponent:(NSInteger)component rightAlignedAt:(CGFloat)offset reusingView:(UIView *)view 

//.........................    

    label = [self shadedLabelWithText:title ofSize:pointSize :component];

//..........................
 



  - (UILabel *)shadedLabelWithText:(NSString *)label ofSize:(CGFloat)pointSize :(NSInteger)component 
    

    UILabel *labelView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height)];

    labelView.text = label;

    if([label isEqual:@"0"] && component == 1) 

        labelView.textColor = [UIColor grayColor];
    

    return labelView;
    

1 - 有人可以帮我避免选择器视图重用行吗?

2 - 如何让选取器视图以圆形/圆形显示行??

【问题讨论】:

您发布的代码包含一个名为 shadedLabelWithText:ofSize:: 的方法,但您的 viewForRow: 方法调用了一个名为 viewForShadedLabelWithText:ofSize:forComponent:rightAlignedAt:reusingView: 的方法。 对不起,我已经编辑了我的问题...谢谢! 【参考方案1】:

这是给你带来麻烦的代码:

if([label isEqual:@"0"] && component == 1) 
    labelView.textColor = [UIColor grayColor];

你的问题是,由于行被重复使用,当你将一行设置为灰色时,它会离开堆栈,它会在某个时候回来。当它返回时,它的标签颜色将仍然为灰色。

所以,代码应该改成这样

if([label isEqual:@"0"] && component == 1) 
    labelView.textColor = [UIColor grayColor];
 else

    labelView.textColor = [UIColor blackColor]; // Or whatever color it normally is.

对于有关使其循环的问题,您可以将行数设置为一些疯狂的数字,例如 10000(用户永远不会滚动浏览的内容)。然后将选取器的位置设置为 10K 的中间。然后,您将需要一个数组,其中包含您想要在“永无止境”选择器中显示的所有值。

然后,您将使用取模运算符 (%) 检查数组的 count 除以当前行的余数。例如:

-(UIView *)somePickerWantsViewForRow:(int)row

    ...
    NSString *titleForRow = [self.someArray objectAtIndex:(self.someArray.count % row)];
    pickerRow.titleLabel.text = titleForRow;

在本例中,someArray 可能是 ('cat','dog','farmer','pizza')

【讨论】:

感谢您的回复,撤消..我尝试了第一个解决方案,但没有成功:(我现在将尝试循环解决方案... @Ahmad 文字颜色有变化吗?【参考方案2】:

我刚刚发现了“重用行”的问题,就像在下面的方法中将“view”替换为“nil”一样简单。

return [pickerView viewForShadedLabelWithText:s ofSize:20 forComponent:1 rightAlignedAt:52 reusingView:nil];

我花了几个小时才弄明白。哇,难怪我喜欢编程! :)

【讨论】:

以上是关于如何停止 UIPickerView 的可重用性的主要内容,如果未能解决你的问题,请参考以下文章

如何从片段到活动而不会干扰片段的可重用性

React 中样式化组件的可重用性

List 中的可重用性支持 - SwiftUI

UICollectionView 上的可重用性问题

我们能否增加这种面向密钥的访问保护模式的可重用性?

不同应用状态结构级别的reducer的可重用性