Ios shouldperformSegueWithIdentifier无法正常工作

Ios shouldperformSegueWithIdentifier无法正常工作,ios,objective-c,iphone,segue,uistoryboardsegue,Ios,Objective C,Iphone,Segue,Uistoryboardsegue,我试图理解“应该如何使用标识符执行segueWithIdentifier”。 在故事板中,我创建了三个场景“场景1、场景2、场景3”。场景1通过称为“场景1至2”的序列链接到场景2,场景2通过称为“场景2至3”的序列链接到场景3,场景3通过称为“场景3至1”的序列链接到场景1 如下面的代码所示,我调用了“shouldPerformSegueWithIdentifier”,如果segue的标识符是“scene3To1”,则返回NO 在运行时,我希望当我试图通过“scene3To1”从scene3过

我试图理解“应该如何使用标识符执行segueWithIdentifier”。 在故事板中,我创建了三个场景“场景1、场景2、场景3”。场景1通过称为“场景1至2”的序列链接到场景2,场景2通过称为“场景2至3”的序列链接到场景3,场景3通过称为“场景3至1”的序列链接到场景1

如下面的代码所示,我调用了“shouldPerformSegueWithIdentifier”,如果segue的标识符是“scene3To1”,则返回NO

在运行时,我希望当我试图通过“scene3To1”从scene3过渡到scene1时,转换不会发生,但它正常发生……那么“shouldPerformanceSegueWithIdentifier”的目的是什么呢

代码

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
 [super viewDidLoad];
  // Do any additional setup after loading the view, typically from a      
 nib.
 }

 - (void)didReceiveMemoryWarning {
   [super didReceiveMemoryWarning];
   // Dispose of any resources that can be recreated.
 }

 - (IBAction)from1To2:(id)sender {
    NSLog(@"in 1st scene");

       [self performSegueWithIdentifier:@"scene1To2" sender:self];
  }

   - (IBAction)from2To3:(id)sender {
    NSLog(@"in 2nd scene");

    [self performSegueWithIdentifier:@"scene2To3" sender:self];
    }

   - (IBAction)from3To1:(id)sender {
   [self performSegueWithIdentifier:@"scene3To1" sender:self];


   NSLog(@"in 3rd scene");
  }


  -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
  {
    NSLog(@"prepareForSegue");

     if ([segue.identifier isEqualToString:@"scene1To2"])
      {
      NSLog(@"transiting from scene1To2");

     } else if ([segue.identifier isEqualToString:@"scene2To3"])
     {
     NSLog(@"transiting from scene2To3");

     } else if ([segue.identifier isEqualToString:@"scene3To1"])

    {
    NSLog(@"transition from scene 3 back to scene 1");
    }

    }

  -(BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier  
   sender:(id)sender
   {
   NSLog(@"shouldPerformSegueWithIdentifier");

   if ([identifier isEqualToString:@"scene3To1"])
   {
    return NO;
    }


  return YES;
   }

  @end
2017-06-06 16:02:07.301 UnwindSegue-1[699:19450] in 1st scene
2017-06-06 16:02:07.315 UnwindSegue-1[699:19450] prepareForSegue
2017-06-06 16:02:07.316 UnwindSegue-1[699:19450] transiting from  
scene1To2
2017-06-06 16:02:07.320 UnwindSegue-1[699:19450]    
shouldPerformSegueWithIdentifier
2017-06-06 16:02:08.245 UnwindSegue-1[699:19450] in 2nd scene

2017-06-06 16:02:08.260 UnwindSegue-1[699:19450] prepareForSegue
2017-06-06 16:02:08.260 UnwindSegue-1[699:19450] transiting from    
scene2To3

2017-06-06 16:02:08.265 UnwindSegue-1[699:19450]    
shouldPerformSegueWithIdentifier
2017-06-06 16:02:09.165 UnwindSegue-1[699:19450] prepareForSegue
2017-06-06 16:02:09.165 UnwindSegue-1[699:19450] transition from 
scene 3 back to scene 1
2017-06-06 16:02:09.167 UnwindSegue-1[699:19450] in 3rd scene
2017-06-06 16:02:09.167 UnwindSegue-1[699:19450] 
shouldPerformSegueWithIdentifier
输出

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
 [super viewDidLoad];
  // Do any additional setup after loading the view, typically from a      
 nib.
 }

 - (void)didReceiveMemoryWarning {
   [super didReceiveMemoryWarning];
   // Dispose of any resources that can be recreated.
 }

 - (IBAction)from1To2:(id)sender {
    NSLog(@"in 1st scene");

       [self performSegueWithIdentifier:@"scene1To2" sender:self];
  }

   - (IBAction)from2To3:(id)sender {
    NSLog(@"in 2nd scene");

    [self performSegueWithIdentifier:@"scene2To3" sender:self];
    }

   - (IBAction)from3To1:(id)sender {
   [self performSegueWithIdentifier:@"scene3To1" sender:self];


   NSLog(@"in 3rd scene");
  }


  -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
  {
    NSLog(@"prepareForSegue");

     if ([segue.identifier isEqualToString:@"scene1To2"])
      {
      NSLog(@"transiting from scene1To2");

     } else if ([segue.identifier isEqualToString:@"scene2To3"])
     {
     NSLog(@"transiting from scene2To3");

     } else if ([segue.identifier isEqualToString:@"scene3To1"])

    {
    NSLog(@"transition from scene 3 back to scene 1");
    }

    }

  -(BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier  
   sender:(id)sender
   {
   NSLog(@"shouldPerformSegueWithIdentifier");

   if ([identifier isEqualToString:@"scene3To1"])
   {
    return NO;
    }


  return YES;
   }

  @end
2017-06-06 16:02:07.301 UnwindSegue-1[699:19450] in 1st scene
2017-06-06 16:02:07.315 UnwindSegue-1[699:19450] prepareForSegue
2017-06-06 16:02:07.316 UnwindSegue-1[699:19450] transiting from  
scene1To2
2017-06-06 16:02:07.320 UnwindSegue-1[699:19450]    
shouldPerformSegueWithIdentifier
2017-06-06 16:02:08.245 UnwindSegue-1[699:19450] in 2nd scene

2017-06-06 16:02:08.260 UnwindSegue-1[699:19450] prepareForSegue
2017-06-06 16:02:08.260 UnwindSegue-1[699:19450] transiting from    
scene2To3

2017-06-06 16:02:08.265 UnwindSegue-1[699:19450]    
shouldPerformSegueWithIdentifier
2017-06-06 16:02:09.165 UnwindSegue-1[699:19450] prepareForSegue
2017-06-06 16:02:09.165 UnwindSegue-1[699:19450] transition from 
scene 3 back to scene 1
2017-06-06 16:02:09.167 UnwindSegue-1[699:19450] in 3rd scene
2017-06-06 16:02:09.167 UnwindSegue-1[699:19450] 
shouldPerformSegueWithIdentifier
*情节提要**:


问题是您的Segue连接到按钮,但您的iAction也连接到该按钮。。。在iAction代码中,您正在手动调用同一段的
performsguewithidentifier

要创建要手动调用的序列,请从控制器图标按住ctrl键并拖动,而不是从按钮按住ctrl键并拖动:


现在,您可以将该逻辑放入iAction方法中,而不是使用
shouldPerformSegueWithIdentifier
来确定是否继续。该代码是否在所有三个视图控制器中重复?是否调用了
shouldPerformSegueWithIdentifier:
是否从3到1:
调用?@Larme请查看上面的输出部分,我发布了输出ireceived@DonMag不,我有一个类,叫做ViewController,三个视图控制器与itHmmm关联。。。我找不到这方面的文档,但似乎只有在segue自动触发时才会调用
shouldPerformSegueWithIdentifier