【问题标题】:UIAlertController can't be called by other classUIAlertController 不能被其他类调用
【发布时间】:2016-01-05 17:37:05
【问题描述】:

我正在尝试编写一个用于解析 xml 的类。我想在发生错误时显示警报。 这是我的代码:

解析.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 调用了

谁能解决这个问题?谢谢

【问题讨论】:

  • 当应用程序崩溃时,Xcode 应该停止在有问题的行。哪条线?
  • 停在 self.presentViewController(alertController, animated: true, completion: nil)

标签: ios swift


【解决方案1】:

在 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)
}

【讨论】:

  • 我用另一种方式来做我想做的事,但我认为你的回答也很有用。谢谢你的帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 2022-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多