【问题标题】:Xcode storyboard cancel push if a condition is not met如果不满足条件,Xcode 情节提要取消推送
【发布时间】:2012-02-21 02:09:19
【问题描述】:

我在导航视图控件中有一个带有按钮的故事板,该控件也有文本字段,它使用故事板 segue push。 但是,我有一些输入检查,如果任何文本字段为空,我会提醒用户。

我可以这样做,但它会提醒用户,然后切换到另一个视图。

如果按钮 Pressed 方法中不满足 if 条件,有没有办法取消这个 push

注意,此推送是由故事板界面创建的,而不是由代码创建的。

【问题讨论】:

    标签: xcode uiviewcontroller uinavigationcontroller push storyboard


    【解决方案1】:

    不要通过从按钮拖动到目标控制器来创建转场。相反,只需从源控制器拖动到目标控制器即可创建一个 segue。单击 segue 并使用属性检查器指定 segue 是推送并给 segue 一个标识符(goToDestination)。然后将按钮连接到源视图控制器中的 IBAction。在 IBAction 方法中进行检查,如果要进行推送,请添加以下代码:

    [self performSegueWithIdentifier: @"goToDestination" sender: self];
    

    【讨论】:

      【解决方案2】:

      以下代码也可用于不同类型的转场,如推送、展开等。从情节提要中命名转场并使用此处给出的代码。如果您不希望执行特定的 segue,则为条件返回 NO,并默认返回 YES。这个方法应该在源视图控制器中。

      - (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
          if ([identifier isEqualToString:@"Segue_Name"]) {
              NSLog(@"Segue Blocked");
              //Put your validation code here and return YES or NO as needed
              return NO;
          }
      
          return YES;
      }
      

      【讨论】:

      • 这样更好,因为您可以将推动箭头保留在情节提要中,只需对其进行修改以添加必要的条件
      【解决方案3】:

      如果 buttonAction 是必须在单击按钮时执行的方法,则必须在其中调用两个方法 1. 检查条件的方法 2. 控制segue的方法

       - (IBAction)buttonAction:(id)sender
           {
           [self validateEnteredData];
           [self shouldPerformSegueWithIdentifier:kSegueName sender:sender];
           }
      

      您的验证方法如下所示

      -(void)validateEnteredData
       {
      if (self.usernameTextField.text.length==0 && self.passwordTextField.text.length==0)
      {
          UIAlertView * alert=[[UIAlertView alloc]initWithTitle:kError message:kInvalidationMessage delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
          [alert show];
          return;
      }
      else if (![self.usernameTextField.text isEqualToString:@"admin"] && ![self.passwordTextField.text isEqualToString:@"pass"])
      {
          UIAlertView * alert=[[UIAlertView alloc]initWithTitle:kError message:kLoginFailed delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
          [alert show];
          return;
      }
      }
      

      和segue可以通过下面的代码段来控制

      - (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
      {
      if ([identifier isEqualToString:kSegueName])
      {
      //Validation: Return NO if you don't want to execute the segue action        
          if (self.usernameTextField.text.length==0 && self.passwordTextField.text.length==0)
          {
              return NO;
          }
          else if (![self.usernameTextField.text isEqualToString:@"admin"] && ![self.passwordTextField.text isEqualToString:@"pass"])
          {
              return NO;
          }
       }
      
        return YES;
      }
      

      【讨论】:

        猜你喜欢
        • 2015-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多