当前位置: 首页 > 知识库问答 >
问题:

触发PerformSGueWithIdentifier后,自定义segue的perform方法出现问题

宣星光
2023-03-14

我有一个有2个场景的故事板。每个场景都有一个从ViewController图标拖到另一个场景的segue ctrl。从第一个视图到第二个视图的Segue具有标识符“左”,从第二个视图到第一个-“右”,两个Segue都指向从UIStoryboardSegue继承的相同自定义类。每个ViewController在属性检查器中都有一个标题,并且还没有为它们分配任何自定义类。

在AppDelegate中,我为所有4个方向设置了UISwipegestureRecognitor,并根据用户的滑动方式,如果当前视图控制器有一个标识符为“left”、“right”、“up”或“down”的序列,它将触发Performsguewithidentifier:

- (void) handleSwipe:(UISwipeGestureRecognizer *) recognizer {
NSString *direction;
    switch ([recognizer direction]) {
        case UISwipeGestureRecognizerDirectionLeft:
            direction = @"left";
            break;
        case UISwipeGestureRecognizerDirectionUp:
            direction = @"up";
            break;
        case UISwipeGestureRecognizerDirectionDown:
            direction = @"down";
            break;
        default:
            direction = @"right";
            break;
    }
    @try {
        UIViewController *rootVC = self.window.rootViewController;
        [rootVC performSegueWithIdentifier:direction sender:rootVC];
    } @catch (NSException *e) {
        NSLog(@"Segue with identifier <%@> does not exist", direction);
    }
}

在我的自定义Segue类中,我重写了“perform”方法,如下所示(没有什么特别之处,因为它会按原样中断,但我很自然地重写了它,以便以后能够为Segue定制动画):

-(void) perform {
    UIViewController *src = (UIViewController *) self.sourceViewController;
    UIViewController *dst = (UIViewController *) self.destinationViewController;

    NSLog(@"source: %@, destination: %@", src.title, dst.title);

    [src presentModalViewController:dst animated:NO];
}

然而,它只在第一次向左滑动时起作用一次,之后什么也不会发生。我可以通过“perform”方法中的NSLog看到,在第一次转换之后,segue的源视图和目标视图控制器不会因为某种原因而改变,只是在以后保持不变。看起来我遗漏了一些简单的东西,但我想不出来。

不要对我太苛刻;),我是iOS发展的新手。

共有1个答案

巫马山
2023-03-14

我认为这是因为您总是在rootViewController上执行segue,而segue只是调用presentModalViewController。一个控制器一次只能有一个模态;如果要继续呈现模态,需要从堆栈顶部的视图控制器中呈现它们。我不知道你的意思是不是。。除非您希望能够在控制器堆栈中向后弹出,否则继续显示模态是没有意义的。

如果您实际上不需要modals,可以将序列中的rootViewController替换为目标:

-(void) perform {
    UIViewController *dst = (UIViewController *) self.destinationViewController;
    // do some animation first
    [[[UIApplication sharedApplication] delegate].window.rootViewController = dst;
}

还应该注意的是,像你在问题中提到的那样,在应用程序代理上有一个手势识别器是非常奇怪的。实现自己的UIViewController子类会更有意义,该子类在自身上执行刷卡处理和调用performsguewithidentifier:。

 类似资料:
  • 问题内容: 在上面的代码中,我有2个问题:1)。它具有编译错误:’UINavigationController!’ 没有名为“ pushViewController”的成员 但是在该类中,确实有一个pushViewController方法。 2)。我必须添加注释:@objc(SEPushNoAnimationSegue),否则,在情节提要中,它只能识别随机生成的名称,例如_tcxxxxSEPush

  • 问题内容: 这是我的自定义Segue的代码 我以为这可行,但实际上只有在执行segue后,视图才会改变。我应该怎么做才能使视图在中间出现“翻转”时发生变化? 提前致谢。 问题答案: 从iOS 7开始,我们通常不使用自定义序列为过渡设置动画。我们要么使用标准的模态演示,指定一个(即,可以为模态过渡选择的一些动画的固定列表),要么实现自定义动画过渡。这两个描述如下: 如果仅显示另一个视图控制器的视图,

  • 因此,基本上,当为时,即第一次,应在20秒内触发,并将设置为。从下一次开始,它应该每隔5秒就会被发射一次。 我面临的问题是,每次被激发时,输出中只有一条消息。也就是说,我在20秒后收到一条消息,每5秒收到一条消息。我希望在每次触发的输出中有20条消息。 如果我使用并创建一个五秒的时间窗口,则每5秒输出20条消息。请帮我把这个代码弄对。我是不是缺了什么?

  • 问题内容: 我想编写自己的Web安全模块库,但无法解决问题。例; 我有一堂课,有一种方法。方法有我的自定义注释。 当此方法调用时,如何触发我的注释。 (示例; Hibernate验证程序。我们在method上编写了hibernate批注,它仅在被调用的方法上起作用) 顺便说一句我的英语不好:) 问题答案: 注释不是“触发的” …您必须编写代码来查找它们的存在并采取措施。 “代码”可以在运行时执行,

  • 我读到了Crudrepository,这是一个接口,用于在特定类型的存储库上进行通用CRUD操作。 但是我们可以创建我们的自定义接口并扩展CrudRepository。

  • 本文向大家介绍android自定义弹出框样式的实现方法,包括了android自定义弹出框样式的实现方法的使用技巧和注意事项,需要的朋友参考一下 前言: 做项目时,感觉android自带的弹出框样式比较丑,很多应用都是自己做的弹出框,这里也试着自己做了一个。 废话不说先上图片: 实现机制 1.先自定义一个弹出框的样式 2.自己实现CustomDialog类,继承自Dialog,实现里面方法,在里面加