接收者 (<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);
         }];
    }