2016-01-05 3 views
-1

Я пытаюсь написать класс для синтаксического анализа xml. Я хочу показать предупреждение, когда возникнет некоторая ошибка. Вот мой код:UIAlertController не может быть вызван другим классом

Parse.swift

func parserXml(xmlUrl:String,completionHandler:([(staID: String, staName: String, ava: String, unava: String)]->Void)?)->Void{ 

    self.paraserCompletionHandler = completionHandler 
    let request = NSURLRequest(URL: NSURL(string: xmlUrl)!) 
    let urlConfig = NSURLSessionConfiguration.defaultSessionConfiguration() 
    urlConfig.timeoutIntervalForRequest = 30 
    urlConfig.timeoutIntervalForResource = 60 
    let urlSession = NSURLSession(configuration: urlConfig, delegate: self, delegateQueue: nil) 

    let task = urlSession.dataTaskWithRequest(request, completionHandler: {(data,response,error)->Void in 
     if error != nil{ 
      print(error?.localizedDescription) 
      if (error?.code == NSURLErrorTimedOut || error?.code == NSURLErrorNotConnectedToInternet){ 
       let vc = ViewController() 
       vc.alertView() 
      } 
     }else{ 
      let parser = NSXMLParser(data: data!) 
      parser.delegate = self 
      parser.parse() 
     }    
    }) 
    task.resume() 
} 

ViewController.swift

func alertView(){ 
    var alertController = UIAlertController(title: "Title", message: "Message", preferredStyle: .Alert) 
    var okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default) 
    self.presentViewController(alertController, animated: true, completion: nil) 
} 

Когда я запускаю мое приложение, мое приложение аварии и показать ошибки

fatal error: unexpectedly found nil while unwrapping an Optional value

EDIT : Xcode Стоп на

self.presentViewController(alertController, animated: true, completion: nil) 

Я думаю, причина alertController в ViewController.swift вызывается Parse.swift

может кто-нибудь решить этот вопрос? thx

+0

Xcode должен остановиться на проблемной строке при сбое приложения. Какая линия? – Cristik

+0

stop at self.presentViewController (alertController, анимированный: true, завершение: ноль) – Keith

ответ

0

Бросьте custom exception в Parse.swift и поймайте его в ViewController.swift. Вы можете создать пользовательский класс (NSException), где вы устанавливаете этот exception и реализуете его в обоих.

help Обработка исключений, если они не знакомы.

if error { 
    print(error?.localizedDescription) 
    if (error?.code == NSURLErrorTimedOut || 
     error?.code == NSURLErrorNotConnectedToInternet){ 
     @throw [[CustomException alloc] initWithName:@"Title" 
               reason:@"Message" 
              userInfo:nil]; 
    } 
} else{ 
      let parser = NSXMLParser(data: data!) 
      parser.delegate = self 
      parser.parse() 
     } 

В ViewControllertry() вызова parserXml (...), а затем в catch(), что это когда вы даете уведомление таким образом, вы можете бросить несколько исключений в parserXml(...), которые сделали бы это следующее заявление идеально, если вы имеете несколько типов ошибок вы хотите отобразить.

catch (YourCustomException *ce) { 
    alertController = UIAlertController(title: ce.name, 
             message: ce.message, 
           preferredStyle: .Alert) 
} 
+0

большое спасибо. Я попробую позже – Keith

+0

@Keith Это работало для вас? – Jaba

+1

Я использую другой способ сделать то, что хочу, но я думаю, что ваш ответ тоже полезен. Спасибо за вашу помощь :) – Keith

Смежные вопросы