2

我有一个 UIPickerView,我希望在 selectRow 动画完成时收到通知。

我在我的视图控制器中尝试了以下方法,它引用了 UIPickerView 并且它不起作用:

-(void)viewDidLoad
{
    ...
    [UIPickerView setAnimationDelegate:self];
    [UIPickerView setAnimationDidStopSelector:@selector(animationFin ished:finished:context];
    ...
}

- (void)animationFinishedNSString *)animationID finishedBOOL)finished contextvoid *)context
{
    if (finished) {

    }

}

然后在我的代码中的某个地方,我启动了动画:

[picker selectRow:random() % pickerDataCount inComponent:0 animated:YES];
4

3 回答 3

2

您需要将方法调用嵌套到 beginAnimations/commitAnimation 块中。

- (void) animationFinished:(NSString *)animationID finished:(BOOL)finished context:(void *)context {
    NSLog(@"Here I am");
}


- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{

    [UIView beginAnimations:@"1" context:nil]; // nil = dummy
    [UIPickerView setAnimationDelegate:self];
    [UIPickerView setAnimationDidStopSelector:@selector(animationFinished:finished:context:)];
    [myPickerView selectRow:0 inComponent:0 animated:YES]; // jump with any swipe in picker always to row=0 as dummy to initiate animation
    [UIView commitAnimations];

    //...whatever comes in addition...
}
于 2009-04-17T09:50:53.333 回答
1

当它要求查看您感兴趣的组件和行时,您可以从 viewForRow 向 self 发布通知。

您只需要将行和组件作为属性并在调用 selectRow 之前对其进行设置。而且,在 viewForRow

if ( (component == [self component] && (row == [self row] ) 向 self 发布通知

于 2009-09-23T23:02:35.573 回答
1

我混合了这里提到的不同答案来解决它。行为将是它会等到滚动完成,然后保存选定的值。

  1. 创建两个变量,分别存储滚动状态和应保存状态。在 didSet 中,您将检查是否在选择器滚动时按下了保存按钮。如果是,请在选择器完成滚动后调用 save 。

    var shouldSave = false
    var pickerViewIsScrolling = false {
        didSet {
            if !pickerViewIsScrolling && shouldSave {
                save()
            }
        }
    }
    
  2. 要识别选择器是否正在滚动,请添加选择器pickerViewIsScrolling = trueviewForRow方法。

    func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
        pickerViewIsScrolling = true
        ...
    }
    
  3. 要识别选择器是否已停止滚动,请添加pickerViewIsScrolling = falsedidSelectRow选择器的。

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
         pickerViewIsScrolling = false 
         ...
    }
    
  4. 在您的save()函数中添加以下内容以检查选择器是否正在滚动(并在停止后保存)或不滚动并直接保存。

    func save() {
         if(pickerViewIsScrolling){
              shouldSave = true
              return
         }
    
         // Save the Data...
    
    }
    
  5. 最后viewDidAppear将这一行添加到您的函数中以捕获pickerViewIsScrolling = true初始生成的视图。

    override func viewDidAppear(_ animated: Bool) {
    
         super.viewDidAppear(animated)
    
         pickerViewIsScrolling = false
    
         ...
    
    }
    

这对我来说很好。我还在按下保存时实现了按钮的停用,它正在等待滚动完成。所以用户不会感到困惑,为什么在滚动停止之前什么都没有发生。

于 2017-07-26T09:40:23.383 回答