如何在1个动作上添加2个segue?

时间:2014-03-24 11:08:42

标签: ios objective-c uitableview uiviewcontroller segue

我有一个显示我的数组项目的tableview。 。我用我的故事板将push style segue连接到detailviewcontroller屏幕,但我不想把所有项目都转到detailviewcontroller,所以我做了一个像这样的控制器;

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

if (sender == self.btnEkle) return;
if (sender == self.btnKrediKartlarim) return;

NSString *bankaAdi = [[mainList objectAtIndex:indexPath.row] objectForKey:@"BankaAdi"];

if (bankaAdi.length > 1) {

    KartDetay *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"KartDetay"];

    [self presentViewController:vc animated:YES completion:nil];

}

如果bankaAdi.length> 1我的应用程序应该转到KartDetay

如果它不是我的意思,我的应用程序应该转到detailviewcontroller

这些代码正在运行,但我的编译器出错了。

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

对不起我的英语我知道我没有清楚地描述自己,但请尽量帮助我。

谢谢!

---更新区----

首先感谢您的回答。但它不起作用或我无法做到。

1-我为我的KartDetay(“taksit”segue名字)和我的DetayEkran(“detay”segue名字)创建了2个manuel不同的segues ..

2 - 我使用这些代码..

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

NSIndexPath *indexPath2 = [self.tableView indexPathForSelectedRow];
bankaAdi = [[mainList objectAtIndex:indexPath2.row] objectForKey:@"BankaAdi"];

if (bankaAdi.length > 1)
{
    [self performSegueWithIdentifier:@"taksit" sender:nil];
}

else
    {
    [self performSegueWithIdentifier:@"detay" sender:nil];
    }

}

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

    if ([segue.identifier isEqualToString:@"taksit"])
    {
    //if (sender == self.btnEkle) return;
    //if (sender == self.btnKrediKartlarim) return;

    KartDetay *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"KartDetay"];
    [self presentViewController:vc animated:YES completion:nil];

    }
 else
    {

        DetayEkran *detayEkran = [self.storyboard instantiateViewControllerWithIdentifier:@"DetayEkran"];
        [self presentViewController:detayEkran animated:YES completion:nil];
    }

当我运行我的应用程序并点击我的第一个单元格bankaAdi> 1.

应用程序可以转到KartDetay屏幕,但我的编译器说:

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

再次感谢您的回答。

----重新更新区域 - 问题由Greg解决......谢谢你的Greg ......

我用这些代码犯了一个大错,因为我称之为另一个DetayEkran *detayEkran = [self.storyboard instantiateViewControllerWithIdentifier:@"DetayEkran"]; [self presentViewController:detayEkran animated:YES completion:nil];

在我的prepareforsegue方法中。当我删除我的prepareforsegue方法中的所有实例化代码时,我的应用程序工作正常...

所以

Greg代码就像魅力一样..谢谢Greg!

2 个答案:

答案 0 :(得分:0)

在打开详细视图控制器之前调用prepareForSegue:sender:方法。它是准备过渡的地方,而不是呈现/推动视图控制器。实际转换是在调用方法后完成的。是使用推送还是现在,取决于故事板中的segue类型。

尝试使用tableView:didSelectRowAtIndexPath:方法而不是prepareForSegue:sender:方法。这应该可以解决你的问题。

答案 1 :(得分:0)

当调用segue时,调用prepareForSegue:segue方法并处理转换,不应该手动调用presentViewController或推送视图控制器。

最好的方法是在故事板中为KartDetay和detailviewcontroller创建两个不同的标识符。

并覆盖didSelectRowAtIndexPath方法,您可以在其中检查条件并运行相应的segue:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *bankaAdi = [[mainList objectAtIndex:indexPath.row] objectForKey:@"BankaAdi"];

    if (bankaAdi.length > 1) {
        [self performSegueWithIdentifier:@"YOUR1IDENTIFIER" sender:nil]
    }
    else
        [self performSegueWithIdentifier:@"YOUR2IDENTIFIER" sender:nil]

}

如果需要传递任何参数,请使用prepareForSegue方法:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if ([segue.identifier isEqualToString:@"YOUR1IDENTIFIER"]) {

        KartDetay *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"KartDetay"];

        [self presentViewController:vc animated:YES completion:nil];
    }
    else {
        //handle other view controller
    }
}

请记住将segue标识符替换为您的标识符。