shouldPerformSegueWithIdentifier 总是先执行

shouldPerformSegueWithIdentifier always executed first

我有一个名为 "openButtonPressed" 的函数,它会在按下 ui 上的按钮时执行。现在我想首先显示一个加载视图,然后执行 segue。出于某种原因,segue 总是首先被调用。 有人知道吗?

谢谢!

- (void)openButtonPressed:(id)sender
{
    NSDebug(@"Open Button");
    [self showLoadingView];
    static NSString* segueToContinue = kSegueToContinue;

    if ([self shouldPerformSegueWithIdentifier:segueToContinue sender:self]) {
        [self performSegueWithIdentifier:segueToContinue sender:self];
    }
}
- (void)showLoadingView
{
    if(!self.loadingView) {
        self.loadingView = [[LoadingView alloc] init];
        [self.view addSubview:self.loadingView];
    }
    [self.loadingView show];
}

LoadingView 似乎正在初始化时没有指定大小。 它也可能非常快速地执行 segue,您没有时间查看加载视图。

您可以在 performSegue 调用处设置断点并使用 Xcode 中的视图调试器来确认视图是否已加载以及视图被初始化为什么大小。

也许视图的位置或大小不合适。但即使你修复了你需要添加延迟以便用户可以看到加载......我在这里复制了你的场景并且在给视图一个 initWithFrame 之后它出现了,但是因为太快而看不到......

如果你想在 performSegue 之前显示一段时间的加载,你可以使用 performSelector:withObject:afterDelay.

如果您需要等待来自 loadingView 的操作,请在 loadingView 初始化程序中创建一个 completionHandler...

下面的提示对我很有帮助,完全是一个更好的解决方案,但我最终使用 [CATransaction flush]; 强制刷新。

- (void)openButtonPressed:(id)sender
{
    NSDebug(@"Open Button");
    [self showLoadingView];
    [CATransaction flush];
    static NSString* segueToContinue = kSegueToContinue;
    if ([self shouldPerformSegueWithIdentifier:segueToContinue sender:self]) {
        [self performSegueWithIdentifier:segueToContinue sender:self];
    }
}