2

我正在开发一个涉及用户填写文本字段和浏览视图的 iOS 应用程序。目前,导航有时使用导航栏处理,有时通过按钮处理。我尝试将一些字段设为必填:如果这些字段留空,则阻止通过应用程序的进度。这适用于基于按钮的导航,但不适用于导航栏。我的代码如下:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"birthPopBus"]) {
        currentPopoverSegue = (UIStoryboardPopoverSegue *)segue;
        pvc = [segue destinationViewController];
        [pvc setDelegate:self];
    }
    else if([[segue identifier] isEqualToString:@"SecondBusPageSegue"]) {
        //This code breaks the next page

        //Check fields, and create error message (code removed for readability)...

        //If the fields are not filled in, display the alert with generated string.
        if(!(first && last && email && phone && address && zip && ssn && birthFilled)){
            UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Required Fields Missing:"
                message:alertMessageMutable
                delegate:nil
                cancelButtonTitle:@"OK"
                otherButtonTitles:nil];
            [message show];

        }

        //Perform the segue, should only run if all required fields are filled.
        else{     
            [self fillBus1Dictionary];
            NSLog(@"application dictionary: %@", self.application);

            SecBusPage * secondBusPage = segue.destinationViewController;
            secondBusPage.application = self.application;
        }
    }
}

错误消息将显示,但仅在视图更改之后。因此,用户进入 SecondBusPage,并收到一条提示“您没有填写 X、Y、Z 字段”的警报。这对他们来说非常令人困惑。防止导航栏切换视图的任何想法?

提前致谢!

4

3 回答 3

3

您可以通过在下面链接的帖子中实现我的答案中的条件segues 来轻松实现这一点

使用情节提要的条件转场

您不能从 prepareForSegue 取消 segue。而不是基于条件执行segues

于 2013-09-24T17:31:19.930 回答
0

故事板限制了自定义行为的灵活性。

我在我的应用程序中控制导航的方法是:

  • 在项目中创建一个id名为的实例对象(属性),每次出现 a 时,我在方法中使用以下内容将其设置为当前视图控制器:mainDelegateAppDelegateviewControllerviewDidAppear

    appDelegate.mainDelegate = self
    
  • navigationBarnavigationController.

  • 在这个自定义导航栏的类中,在用户点击按钮时,我检查:

    if ([appDelegate.mainDelegate isKindOfClass:[myViewController class]]){
    
        if ([appDelegate.mainDelegate allFieldsAreFilled]){
             //perform action of pushing view
        }
    }
    
  • allFieldsAreFilled是一个委托方法myViewController
于 2013-09-24T16:29:34.167 回答
0

您正在从情节提要中进行转场,并且无法取消情节提要转场。您应该做的是删除该segue并使用:

    if(!(first && last && email && phone && address && zip && ssn && birthFilled)){
        UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Required Fields Missing:"
            message:alertMessageMutable
            delegate:nil
            cancelButtonTitle:@"OK"
            otherButtonTitles:nil];
        [message show];

    }else
   { 
         [self.navigationController pushViewController:yourViewController animation:YES];
   }
于 2013-09-24T16:18:00.453 回答