摇动手势并为 seuge 做准备 - 开始/结束外观转换的不平衡呼叫

Posted

技术标签:

【中文标题】摇动手势并为 seuge 做准备 - 开始/结束外观转换的不平衡呼叫【英文标题】:Shake gesture and prepare for seuge - Unbalanced calls to begin/end appearance transitions 【发布时间】:2014-04-06 18:15:01 【问题描述】:

我有一个UITabelViewController (mainViewCtrl),如果用户选择一个单元格,一个新的UIViewController (detailViewCtrl) 将被推入“场景”,其中包含有关所选单元格的一些详细数据。 - 很简单的东西。

如果用户摇动手机,(detailViewCtrl) 会显示一些随机的细节数据。

这是我的prepareForSeque 代码:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender


    if ([segue.identifier isEqualToString:@"DetailViewSeque"])
    
        int i;

        if ([sender isKindOfClass:[UITableViewCell class]])
            UITableViewCell *cell = (UITableViewCell*)sender;
            NSIndexPath *indexPath = [self.minifigsTableView indexPathForCell:cell];
            i = indexPath.row;
        else
            i = arc4random() % [self.collectionOfData count];
        

            DeatilViewController *dest = [segue destinationViewController];
            dest.data = [self.collectionOfData objectAtIndex:i];

    


代码很简单,没什么花哨的。我的问题是,如果用户在两个 ViewController(mainViewCtrl 和 detailViewCtrl)之间的转换正在进行时摇动手机,我会得到这个错误:

开始/结束外观转换的不平衡调用。

我理解这会导致问题的原因。

但是我该如何解决呢?如何在转换处于活动状态时以某种方式阻止 UIGestureEvent 被触发?

【问题讨论】:

停止添加 Xcode 标签。它不适用于您的问题。 对不起...但是为什么要评论呢? 因为我删除了一次然后你又把它放回去了。自从我再次删除它以来,我想指出为什么我们不会一直来回走动。 :) 【参考方案1】:

这就是我解决问题的方法。

首先我添加了:@property BOOL isInTransit;

然后我将viewDidAppear 方法添加到我的代码中,并将isIntransit 设置为true(转换结束后将调用viewDidAppear。)

-(void)viewDidAppear:(BOOL)animated

    self.isInTransit = true;

最后,我在 motionBegan 方法中添加了一条 if 语句,并在调用 preformeSegueWithIdentifier 之前将 isInTransit 设置为 false:

 - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
    
        if (event.subtype == UIEventSubtypeMotionShake)
        
            if (self.isInTransit)
                self.isInTransit = false;
                [self performSegueWithIdentifier:@"DetailViewSeque" sender:self];
            
        
    

感谢 Armand DOM 帮助我。

【讨论】:

【参考方案2】:

也许您可以添加boolean property "isInTransit"

在您的viewWillAppear 中将其设置为false

在您的prepareForSegue 中将其设置为true(直到您的int i;)。

在你的motionEnded(摇晃方法)测试中if (isInTransit=true) -> 不要处理摇晃,所以不要触发segue。

这会有所帮助

【讨论】:

感谢您帮助我。

以上是关于摇动手势并为 seuge 做准备 - 开始/结束外观转换的不平衡呼叫的主要内容,如果未能解决你的问题,请参考以下文章

摇动手势不起作用

Google AdMob 干扰 SwiftUI 中的摇动手势

更改 SpriteKit 中摇动手势的灵敏度:目标是创建更快的摇动?

保存并检测特定的摇动手势模式 iphone

becomeFirstResponder 似乎仅第一次用于摇动手势

显示 UIAlertView 时处理摇动手势