接收者 (<ViewController>) 没有带标识符的 segue
Receiver (<ViewController>) has no segue with identifier
我不知道并尝试过重命名故事板、清理项目、更改模拟器。我无法通过 segue 来工作。
我有一个从 ViewController (A) 到 ViewController (B) 的手动建模 segue,称为 "MoveToLogin"。
当您单击登录按钮时,我创建了一个包含登录方法的自定义对象的新实例,如下所示:
#ViewController.m
//If the username and password fields are not blank, attempt to log in.
[_custom object loginUser:_usernameTxt.text password:_passwordTxt.text]
#custom object's login method (CustomObject.m)
-(void)loginUser:(NSString *)username password:(NSString *)password
{
ViewController *viewcontroller = [[ViewController alloc]init];
//Attempts to log in the user
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
NSDictionary *params = @ {@"username" : username, @"password": password};
[manager POST:_login_url parameters:params
success:^(AFHTTPRequestOperation *operation, id responseObject)
{
if([responseObject objectForKey:@"login_okay"])
{
_valid_login = YES;
[viewcontroller onSuccessfulLogin];
}
else
{
_valid_login = NO;
[viewcontroller onInvalidLogin];
}
}
failure:
^(AFHTTPRequestOperation *operation, NSError *error) {
[viewcontroller onRequestFail];
}];
}
如您所见,自定义对象的方法显然位于另一个 class 中,在收到来自服务器的 json 响应后调用 ViewController (a) 方法 onSuccessfulLogin。
该方法如下所示:
-(void)onSuccessfulLogin
{
//if we get a successful login
[self performSegueWithIdentifier:@"MoveToLogin" sender:nil];
}
但是每当我成功登录时,都会收到这条令人愉快的消息:
terminating app due to uncaught exception
'NSInvalidArgumentException', reason: 'Receiver () has no segue with identifier 'MoveToLogin''
您不能像现在这样创建 viewcontroller
的实例。一般来说,让您的异步方法使用 blocks/delegates 是件好事。
使用完成块做这样的事情怎么样..
#ViewController.m
//If the username and password fields are not blank, attempt to log in.
[_customobject loginUser:@"" password:@"" completionBlock:^(BOOL validLogin, NSError *error) {
if(error){
[self onRequestFail];
}else{
if(validLogin){
//if we get a successful login
[self performSegueWithIdentifier:@"MoveToLogin" sender:nil];
}else{
//if we get a invalid login
}
}
}];
#custom object's login method (CustomObject.m)
-(void)loginUser:(NSString *)username password:(NSString *)password completionBlock:(void (^)(BOOL validLogin, NSError *error))completionblock{
//Attempts to log in the user
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
NSDictionary *params = @ {@"username" : username, @"password": password};
[manager POST:_login_url parameters:params
success:^(AFHTTPRequestOperation *operation, id responseObject)
{
if([responseObject objectForKey:@"login_okay"])
{
_valid_login = YES;
if (completionblock) completionblock(YES, nil);
}
else
{
_valid_login = NO;
if (completionblock) completionblock(NO, nil);
}
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
if (completionblock) completionblock(NO, error);
}];
}
我不知道并尝试过重命名故事板、清理项目、更改模拟器。我无法通过 segue 来工作。
我有一个从 ViewController (A) 到 ViewController (B) 的手动建模 segue,称为 "MoveToLogin"。
当您单击登录按钮时,我创建了一个包含登录方法的自定义对象的新实例,如下所示:
#ViewController.m
//If the username and password fields are not blank, attempt to log in.
[_custom object loginUser:_usernameTxt.text password:_passwordTxt.text]
#custom object's login method (CustomObject.m)
-(void)loginUser:(NSString *)username password:(NSString *)password
{
ViewController *viewcontroller = [[ViewController alloc]init];
//Attempts to log in the user
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
NSDictionary *params = @ {@"username" : username, @"password": password};
[manager POST:_login_url parameters:params
success:^(AFHTTPRequestOperation *operation, id responseObject)
{
if([responseObject objectForKey:@"login_okay"])
{
_valid_login = YES;
[viewcontroller onSuccessfulLogin];
}
else
{
_valid_login = NO;
[viewcontroller onInvalidLogin];
}
}
failure:
^(AFHTTPRequestOperation *operation, NSError *error) {
[viewcontroller onRequestFail];
}];
}
如您所见,自定义对象的方法显然位于另一个 class 中,在收到来自服务器的 json 响应后调用 ViewController (a) 方法 onSuccessfulLogin。
该方法如下所示:
-(void)onSuccessfulLogin
{
//if we get a successful login
[self performSegueWithIdentifier:@"MoveToLogin" sender:nil];
}
但是每当我成功登录时,都会收到这条令人愉快的消息:
terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Receiver () has no segue with identifier 'MoveToLogin''
您不能像现在这样创建 viewcontroller
的实例。一般来说,让您的异步方法使用 blocks/delegates 是件好事。
使用完成块做这样的事情怎么样..
#ViewController.m
//If the username and password fields are not blank, attempt to log in.
[_customobject loginUser:@"" password:@"" completionBlock:^(BOOL validLogin, NSError *error) {
if(error){
[self onRequestFail];
}else{
if(validLogin){
//if we get a successful login
[self performSegueWithIdentifier:@"MoveToLogin" sender:nil];
}else{
//if we get a invalid login
}
}
}];
#custom object's login method (CustomObject.m)
-(void)loginUser:(NSString *)username password:(NSString *)password completionBlock:(void (^)(BOOL validLogin, NSError *error))completionblock{
//Attempts to log in the user
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
NSDictionary *params = @ {@"username" : username, @"password": password};
[manager POST:_login_url parameters:params
success:^(AFHTTPRequestOperation *operation, id responseObject)
{
if([responseObject objectForKey:@"login_okay"])
{
_valid_login = YES;
if (completionblock) completionblock(YES, nil);
}
else
{
_valid_login = NO;
if (completionblock) completionblock(NO, nil);
}
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
if (completionblock) completionblock(NO, error);
}];
}