我对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放在登录按钮上时所有导航工作正常,我认为它与调用操作有关。无论是那个或某种程度上我的视图或视图控制器层次结构都搞砸了。
关于我做错了什么的任何想法? 这是一个登录的好方法吗?
非常感谢任何帮助, 纳特
答案 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之间的主要区别