Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使shouldPerformSegueWithIdentifier等待块完成_Ios_Objective C_Uistoryboard_Uistoryboardsegue - Fatal编程技术网

Ios 如何使shouldPerformSegueWithIdentifier等待块完成

Ios 如何使shouldPerformSegueWithIdentifier等待块完成,ios,objective-c,uistoryboard,uistoryboardsegue,Ios,Objective C,Uistoryboard,Uistoryboardsegue,我创建了一个推送序列,并将标识符命名为“CustomIdentifier”。用户成功注册后,将执行shouldPerformSegueWithIdentifier并推送到另一个视图控制器。如何使推送操作等待用户注册块返回成功,然后执行推送操作?我现在正在做的事情如下所示,但无论注册是否成功,都会执行推送。有什么更好的解决办法?顺便说一下,我知道我可以创建iAction,但我使用的是RBStoryboardLink,所以它必须是一个推送序列。IBAction不与RBStoryboardLink一起

我创建了一个推送序列,并将标识符命名为“CustomIdentifier”。用户成功注册后,将执行shouldPerformSegueWithIdentifier并推送到另一个视图控制器。如何使推送操作等待用户注册块返回成功,然后执行推送操作?我现在正在做的事情如下所示,但无论注册是否成功,都会执行推送。有什么更好的解决办法?顺便说一下,我知道我可以创建iAction,但我使用的是RBStoryboardLink,所以它必须是一个推送序列。IBAction不与RBStoryboardLink一起工作

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{
    __block BOOL should;
    if ([identifier isEqualToString:@"Question"]) {
        AVUser *newUser = [AVUser user];
        newUser.username = self.usernameField.text;
        newUser.password = self.passwordField.text;
        newUser.email = self.emailField.text;

        [newUser signUpInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
            if (succeeded) {
                should = YES;
            } else {
                should = NO;
            }
        }];
    }
    return should;
}

在要执行segue的位置使用
performsguewithidentifier
。这样,您将只在实际需要时调用segue

[self performSegueWithIdentifier:@"yourSegue" sender:nil];
调用此方法后,将立即调用
prepareforsgue
方法。在
prepareForSegue
中,您可以在执行segue之前编写要执行的代码。 例如设置变量值或传输其他数据等


希望这有帮助。

编辑1:也许你应该选择:

  • 在登录和登录成功时,让您的登录可以(在块中)使用
    NSNotificationCenter
    发送
    NSNotifications

    [newUser signUpInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        if (succeeded) {
            [[NSNotificationCenter defaultCenter] postNotificationName:@"LoginSuccess" object:self];
        } else {
            [[NSNotificationCenter defaultCenter] postNotificationName:@"LoginFailure" object:self];
        }
    }];
    
  • 加载视图控制器时,在
    NSNotificationCenter
    上注册这些通知

    - (void)viewDidAppear
    {
        [[NSNotificationCenter defaultCenter] void)addObserver:self selector:@selector(loginSuccess:) name:@"LoginSuccess" object:nil]
        [[NSNotificationCenter defaultCenter] void)addObserver:self selector:@selector(loginFailure:) name:@"LoginFailure" object:nil]
    }
    
  • 在发送登录成功通知时收到通知的操作方法(
    -(void)loginsucess:(NSNotification*)notification
    )中,您调用
    [self-PerformsgueWithIdentifier:@“YourIdentifier”发送者:self]

  • 在操作方法
    -(void)loginFailure:(NSNotification*)notification
    (在失败通知中调用)中,您可能会显示一个alertview或unblock UI(如果它之前被阻止,用户不会单击“关于”)

  • …根据您的方法,我将使用一个调度组,如:


    @Rushabh似乎没有公认的答案。如果不阻止主线程,您就无法做到这一点。在调用方法之前,您可能需要收集这些信息。@holex是正确的。执行
    signUpInBackgroundWithBlock
    ,然后在成功的情况下执行segue。如果应等于否,则UI没有响应,它被冻结。需要做什么?可能在登录成功之前您正在阻止UI。如果是这样,请确保在登录失败时也取消阻止它。编辑我的帖子是为了提供另一个选项,在设计和行为的意义上可能更“透明”。我知道performsguewithidentifier。因为我没有向这个按钮条添加iAction,只添加了一个push segue。那么,我应该在哪里调用这个performsguewithidentifier方法呢?在您的区块中,是否应使用标识符执行SegueWithIdentifier!。。当你想这样做的时候,在程序块的末尾,你需要将按钮连接到一个iAction,iAction进行登录,然后执行一个“手动”程序。@yong-ho,Mike说的绝对正确。您只需连接和iAction事件,并在希望使用segue转换到下一个视图的位置使用此函数。我已经知道这一点。你们可以看看我的问题。因为我正在使用rbstoryboardlink推送另一个故事板。那么,如何使用rbstoryboardlink执行手动序列呢?
    - (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
    {
        dispatch_group_t dispatchGroup = dispatch_group_create();
        dispatch_group_enter(dispatchGroup);
    
        __block BOOL should;
        if ([identifier isEqualToString:@"Question"]) {
            AVUser *newUser = [AVUser user];
            newUser.username = self.usernameField.text;
            newUser.password = self.passwordField.text;
            newUser.email = self.emailField.text;
    
            [newUser signUpInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
                if (succeeded) {
                    should = YES;
                } else {
                    should = NO;
                }
                // leave group to signal end of processing
                dispatch_group_leave(dispatchGroup);
            }];
        }
    
        // wait until processing has finished
        dispatch_group_wait(dispatchGroup, DISPATCH_TIME_FOREVER);
    
        return should;
    }