Как показать контроллер предупреждений после получения ответа от API в target-c? - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть метод, который отправляет HTTP данные. После получения ответа от API я хочу отобразить UIAlertController на основе кодов состояния.

Предположим, полученный код состояния 409 , поэтому контроллер скажет "данные уже существуют" .

Как представить alert controller и в каком классе, классе обслуживания или любом другом view controller?

ViewController.h

- (IBAction)logIn:(id)sender {

    if (username.text == nil || [password.text isEqualToString:@""])
    {
        UIAlertController *alert = [UIAlertController alertControllerWithTitle:
                                    @"all the fields are mendetary"
                                message:@"missing username or password " preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction *action = [UIAlertAction
                                 actionWithTitle:@"OKAY" style:UIAlertActionStyleDefault handler:^(UIAlertAction *_Nonnull action)
                                 {
                                     //[self dismissViewControllerAnimated:YES completion:nil];
                                 }];
        [alert addAction:action];
       [self presentViewController:alert animated:YES completion:nil];

    }
   else
   {
        [[service SharedInstance] logIn:[NSDictionary dictionaryWithObjectsAndKeys:username.text,@"username",password.text,@"password",nil] params:@"logIn" block:^(const BOOL success, id resultObject, NSError *error )
        {


            // [self performSegueWithIdentifier:@"Loggedin" sender:self];
         }];

    }

   username.text =@"";
    password.text =@"";


    }

Service.m

-(void)logIn:(NSDictionary *)Details params:(NSString *)params block:(ResponseBlock)block{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSError *error;
    NSString *URL = @"http://localhost:8080";
    NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:nil delegateQueue:nil];
    NSString *requestURL = [URL stringByAppendingString:@"/api/signupUser"];
    NSURL *url = [NSURL URLWithString:requestURL]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
                                                           cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:120.0]; NSData *data = [params dataUsingEncoding:NSDataBase64Encoding64CharacterLineLength];
    NSString *base64Encoded = [data base64EncodedStringWithOptions:0];
    NSLog(@"base64Encoded%@",base64Encoded);
    NSString *basicString = @"Basic";
    basicString = [NSString stringWithFormat:@"%@%@",basicString,base64Encoded];
    NSLog(@"basicString%@",basicString);
    [request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request addValue:basicString forHTTPHeaderField:@"Authorization"];
    [request setHTTPMethod:@"POST"];
    NSData *bodyData = [NSJSONSerialization dataWithJSONObject:Details options:0 error:&error];

    [request setHTTPBody:bodyData];NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * data, NSURLResponse *response, NSError *error)
{
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
    long statusCode =[httpResponse statusCode];
    NSLog(@"response status code: %ld", statusCode);
f (error)
       {
           block(NO, response,error);
        }
    else
        {
           NSError *err = nil;
           id responseData = [NSJSONSerialization
           JSONObjectWithData:data options:kNilOptions error:&err];
           NSDictionary* headers= [(NSHTTPURLResponse *)response allHeaderFields];
           NSLog(@"all header fields %@",headers);
           [defaults removeObjectForKey:@"userToken"];
           NSLog(@"token %@",[defaults valueForKey:@"userToken"]);
           NSDate *expireDate = [[NSDate date]dateByAddingTimeInterval:60*25];
           [defaults setObject:expireDate forKey:@"sessionDate"];

            if(err)
            {
              block(NO, response, error);
            }
            else
            {
              block(YES, responseData,nil);
            }
              [task cancel];
        }
      }];
            [task resume];
        }
   @end

1 Ответ

0 голосов
/ 25 апреля 2018

Похоже, вы делаете какой-то http-вызов из служебного файла. Здесь есть несколько вариантов:

  1. Реализуйте делегат вашего класса обслуживания во ViewController для выполнения любой задачи.
  2. Использовать блоки.
  3. Используйте здесь фреймворк как Rx.
  4. или, если вам просто нужно отобразить предупреждение, добавьте предупреждение в текущее окно, например,

Я создал расширение для этой цели:

extension UIAlertController {
/// display alert with custom number of buttons
static func presentAlert(_ title: String?, message: String?, alertButtonTitles: [String], alertButtonStyles: [UIAlertActionStyle], vc: UIViewController, completion: @escaping (Int)->Void) -> Void
{
    let alert = UIAlertController(title: title,
                                  message: message,
                                  preferredStyle: UIAlertControllerStyle.alert)

    for title in alertButtonTitles {
        let actionObj = UIAlertAction(title: title,
                                      style: alertButtonStyles[alertButtonTitles.index(of: title)!], handler: { action in
                                        completion(alertButtonTitles.index(of: action.title!)!)
        })
        alert.addAction(actionObj)
    }
    vc.present(alert, animated: true, completion: nil)
}

} Применение:

UIAlertController.presentAlert("My Title", message: "My message", alertButtonTitles: "OK", alertButtonStyles: [.default], vc: (UIApplication.shared.keyWindow?.rootViewController)!, completion: { (btnIndex) in

    })

Над кодом добавляется UiAlerController поверх окна.

...