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