如何停止 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 的可重用性的主要内容,如果未能解决你的问题,请参考以下文章