手动segue没有正确过渡

时间:2013-05-18 20:54:25

标签: ipad storyboard

我对ios有点新鲜但是我已经能够混淆了......直到现在。我有一个登录页面的应用程序。我做的第一件事是创建一些空视图控制器并将它们粘贴在故事板上。我有一个LoginViewController,其中包含userId和password的一些文本字段以及一个登录按钮。计划是,如果您成功登录,您将被带到TabViewController。现在这是开箱即用的。我删除了用它创建的两个视图控制器,并用两个NavigationControllers替换它们。

只是测试我从登录按钮到TabViewController的所有内容。一切都很好。观点出现了。所有开箱即用的东西都有效。

下一步我尝试模拟实际登录。由于我必须通过Web服务调用来执行此操作,因此我认为它需要是异步的。我删除了为登录按钮添加的初始segue,并从按钮添加了一个IBAction到我的LoginViewController。我还从我的LoginViewController到TabViewController添加了一个手动segue,我把它命名为“loginSegue”

这是我到目前为止的代码:

- (IBAction)login:(id)sender {
[Decorator showViewBusyIn:self.aView
            scale:1.5
        makeWhite:NO];

self.clientIdText.enabled = NO;
self.userIdText.enabled = NO;
self.passwordText.enabled = NO;
UIButton* loginBtn = sender;

loginBtn.enabled = NO;
[Decorator showViewBusyIn:self.aView
             scale:2.0
         makeWhite:NO];

self.operation = [[NSInvocationOperation alloc]
            initWithTarget:self
                  selector:@selector(doLogin)
                object:nil];
self.queue = [[NSOperationQueue alloc] init];
[self.queue addOperation:self.operation];
}

-(void)doLogin{
    [NSThread sleepForTimeInterval:1];
    [Decorator removeBusyIndicatorFrom:self.aView];
// this is where I will eventually put the login code...
    [self performSegueWithIdentifier:@"loginSegue" sender:self];
}

我将调用sleepForTimeInterval来模拟等待Web服务调用完成。我稍后会删除它。装饰器的东西只显示和删除活动指标视图。

当我完成所有这些时,segue可以工作,但与登录视图控制器关联的视图仍保留在屏幕上。换句话说,TabViewController出现了。第一个项目被选中。 NavigationController显示但与之关联的VC及其包含的视图不会出现。 LoginViewController的视图停留在那里。

由于我将segue放在登录按钮上时所有导航工作正常,我认为它与调用操作有关。无论是那个或某种程度上我的视图或视图控制器层次结构都搞砸了。

关于我做错了什么的任何想法? 这是一个登录的好方法吗?

非常感谢任何帮助, 纳特

1 个答案:

答案 0 :(得分:0)

对于这种操作,使用GCD可以更容易。你可以这样做:

- (void)doLogin
{
    dispatch_queue_t loginQueue = dispatch_queue_create(“login”, NULL);
    dispatch_async(loginQueue, ^{         
        // this is where you will eventually put the login code...
        dispatch_async(dispatch_get_main_queue(), ^{
            [Decorator removeBusyIndicatorFrom:self.aView];
            [self performSegueWithIdentifier:@"loginSegue" sender:self];
        });
    }); 
}

在您的-(IBAction)login:(id)sender中,您只需拨打[self doLogin]而不是

self.operation = [[NSInvocationOperation alloc]
                                  initWithTarget:self
                                        selector:@selector(doLogin)
                                          object:nil];
self.queue = [[NSOperationQueue alloc] init];
[self.queue addOperation:self.operation];

选中question,简要说明GCD和NSOperationQueue之间的主要区别