我正在尝试编写一个用于解析xml的类。我想在发生一些错误时显示警报。 这是我的代码:
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)
}
当我运行我的应用时,我的应用崩溃并显示错误
致命错误:在解包可选值时意外发现nil
编辑:Xcode停在
self.presentViewController(alertController, animated: true, completion: nil)
我猜原因是ViewController.swift中的alertController被Parse.swift调用
任何人都可以解决这个问题吗? THX
答案 0 :(得分:0)
在Parse.swift中抛出custom exception并在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()
}
在ViewController
try()
调用parserXml(...)然后在catch()
中,当您以这种方式发出警报时,您可以在parserXml(...)
中抛出多个异常如果您想要显示多种错误类型,请使下一个语句完美。
catch (YourCustomException *ce) {
alertController = UIAlertController(title: ce.name,
message: ce.message,
preferredStyle: .Alert)
}