我有一个UIActionSheet,其中包含一个选择器和一个UIToolbar。在UIToolBar上有一个保存按钮。但是,我的一些用户报告说在UIPickerView停止旋转之前按下了保存按钮,因此仅在旋转之前检索了初始值。
一旦用户点击保存或在旋转时处于活动状态的选定项目获得反馈,是否有办法获得UIPickerView的当前选定项目?
谢谢
即使他们在旋转的过程中将其关闭,即使选择器不可见,选择器仍然会在最终选择的行中调用委托。假设尚未释放,则可以将委托接收器设置为检查选择器是否可见,如果不可见,则保存所选值。
我这样做是假设用户显然没有滚动到随机值-通常,当他们滚动并退出而不等待它稳定下来时,这意味着他们滚动到了列表的顶部或底部。我想在这两种情况下,您可以安全地使用委托的结果。
您是否曾经考虑过使用titleForRow
方法来解决这个问题。在滚动pickerview
时,将调用titleForRow
方法以填充当前查看的行上方或下方的行(取决于选择器旋转的方式)。当选择器停止时,将调用didSelectRow
方法,并且返回的行是titleForRow
方法中填充的最后一行的2行。
我认为您可以选择在滚动中的某个时候停止选择器(计时器来检测用于告诉titleForRow
中的代码以捕获调用中的组件和行的点),然后执行selectRow
将值设置为停止旋转后想要的值(并调用didSelectRow
)。
我不认为这是您自己可以通过UIPickerView
来解决的问题。
现在无法在没有停止动画的情况下选择哪一行(因此,选择器视图将选择停在其上的行)。唯一的方法是通过使用selectRow:inComponent:animated:
告诉选择器停止在哪一行,但是您如何知道那一行呢?您不知道,因为选择器正在旋转...
我认为这只是对UIPickerView
的限制,Apple可能将其描述为预期的行为。
我有同样的问题...我通过在关闭或选择选择器值的方法上简单添加以下代码行来解决此问题。
[_picker selectRow:[_picker selectedRowInComponent:0] inComponent:0 animated:YES];
刚刚找到解决方案,它适用于我的情况。我不需要最后一个更新事件,该事件是在用户将其关闭后选择器停止旋转时生成的。因此,此方法停止滚动并且不会引起新的更新选择事件。似乎您将在此之后检查选择器中的选择是否正确(我不在乎,我在显示选择器时会重新选择值)。
- (void)_resetPickerViewDelegates {
id delegate = [_pickerView.delegate retain];
id dataSource = [_pickerView.dataSource retain];
_pickerView.delegate = nil;
_pickerView.dataSource = nil;
[_pickerView reloadAllComponents];
_pickerView.delegate = delegate;
_pickerView.dataSource = dataSource;
[delegate release];
[dataSource release];
}
单击“保存”按钮,您可以通过以下方式从组件中检索所选对象:>
[component1Array objectAtIndex:[myPicker selectedRowInComponent:1]];
其中,
和“ [[myPicker selectedRowInComponent:2]”将从组件'2'中的myPicker返回当前选择的原始编号。您可以通过
[component2Array objectAtIndex:[myPicker selectedRowInComponent:2]];
希望它对您有用。
这可能是“黑客”,但可以。我的情况略有不同。我正在使用一个UIPicker
,但可以更改它要操纵的对象。
var isSpinning = false(全局)