iOS segue执行两次

10

我有一个表格视图,其中包含不同类型的表格视图单元格。在其中一个单元格中,有两个按钮,当按下时会加载一个视图控制器。我正在使用以下函数来处理按钮的按下:

- (IBAction)leftButtonPressed:(id)sender
{
    // Getting the pressed button
    UIButton *button = (UIButton*)sender;
    // Getting the indexpath
    NSIndexPath *indPath = [NSIndexPath indexPathForRow:button.tag inSection:0];
    // Loading the proper data from my datasource
    NSArray *clickedEvent = [[[SOEventManager sharedEventManager] eventsArray] objectAtIndex:indPath.row];
    [[SOEventManager sharedEventManager] setSelectedEvent:clickedEvent[0]];
    // Everything working as it should up to this point
    // Performing seque...
    [self performSegueWithIdentifier:@"buttonSegue" sender:self];
}

我的buttonSegue应该推送一个新的视图控制器。但是它似乎不止推了一次,因此我收到以下警告:

2013-11-27 01:48:30.894 Self-Ordering App[2081:70b] nested push animation can result in corrupted navigation bar 
2013-11-27 01:48:31.570 Self-Ordering App[2081:70b] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.

在我的情况下,这会导致应用程序崩溃,因为我想要弹出视图控制器并立即返回到表视图的事件。我使用一个警报视图来处理此事件,并使用以下代码处理:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    NSString *buttonTitle = [alertView buttonTitleAtIndex:buttonIndex];
    // ...
    // Additional checking of button titles....
    else if ([buttonTitle isEqualToString:NSLocalizedString(@"Vissza", nil)])
    {
        [self.navigationController popViewControllerAnimated:YES];
    }
}

值得一提的是,我的“常规”表视图单元格还有另一个转换方式,在这种情况下,我使用了prepareForSegue:方法。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"detailSegue"])
    {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        SOEvent *selectedEvent = [[[SOEventManager sharedEventManager] eventsArray] objectAtIndex:indexPath.row];
        [[SOEventManager sharedEventManager] setSelectedEvent:selectedEvent];
    }
}
在这种情况下,视图控制器会被完美地推送,并在需要时立即弹出。我正在iOS7和Xcode 5上进行测试。我以前没有遇到过这样的问题,非常感谢任何帮助。

6
你确定你在Interface Builder中正确连接了操作吗?也许你已经将事件同时连接到了“Touch Up Inside”和“Touch Down Inside”,而不是只连接到“Touch Up Inside”。或者你可能已经在代码和Interface Builder中都指定了Segue。你有检查过吗?这是一个常见的错误。 - Can Poyrazoğlu
哦,该死...你说得对,我把我的按钮也分配在表视图数据源方法中了...谢谢你的回答! - József Vesza
4个回答

17
也许你想用视图控制器来连接转场,而不是使用UIButtons!
你应该将转场连接在类似这样的按钮上: 进入图片描述 但相反地,你应该将它们与视图控制器连接: 进入图片描述

1
这对我有用!(Swift 4,Xcode 9)。不确定为什么这不被更强调!使用委托,如果segue是在按钮(在表格单元格中)之间连接的,则它将始终触发,并且我的委托将在此之后执行。连接到单元格视图时,这种情况不会发生,因此我手动调用segue按计划工作。 - DavidG

16

can poyrazoğlu的回答:

你确定在界面构建器中正确连接了操作吗?可能你已经为触摸UpInside和触摸DownInside两个事件都进行了连接,而不是仅仅为触摸UpInside事件进行连接。或者你可能同时在代码中和界面构建器中再次分配了segue。你有检查过吗?这是一个常见的错误。

我在故事板和我的tableview数据源方法中为每个按钮都分配了触摸UpInside操作。

非常感谢您的快速帮助,can poyrazoğlu!!


哦,我并没有考虑到表格视图,但很高兴看到它有所帮助。不客气 :) - Can Poyrazoğlu
1
我也两次加载了新的视图控制器。我从视图控制器连接了segue,而不是从tableview单元格连接,这解决了问题。 - JeffK

9

针对我所使用的Swift 3、Xcode和iOS 9+等相关技术,确保您从您的UIViewController绘制segue而不是按钮或其他界面。我曾经遇到同样的问题,只需将segue的起点更改为UIController而不是按钮即可消除此错误。


3
我经常在将按钮直接连接到目标视图控制器时遇到这个问题。您需要确保首先删除旧的segue,然后单击当前视图控制器(您从哪里来)并使用CTRL +单击到目标控制器。
这应该会解决问题 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接