如何从内部调用 presentViewController class
How to call presentViewController from inside class
在我的完成处理程序中,我正在尝试 return http 响应代码,就像 JS 中的 alert
一样。一旦我得到这个排序,我希望改进我的 if 语句来识别最终用户的连接问题。我正在看这篇文章。
http://www.ioscreator.com/tutorials/display-an-alert-view-in-ios8-with-swift
我也看到了这个答案 Simple App Delegate method to show an UIAlertController (in Swift) 但我得到了关于 window
未命名的类似方法。
我没有所有噪音的代码是这样的:
class NewsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
var tableView: UITableView!
var titleItems: NSMutableArray = []
var descritpionItems: NSMutableArray = []
class RemoteAPI {
// base url
let baseUrl = "http://api.dev/web/"
// returned array of news titles + descriptions
var newsTitle: NSMutableArray = []
var newsDescription: NSMutableArray = []
func getData(completionHandler: ((NSArray?, NSError?) -> Void)) -> Void {
// get news feed url
let url = NSURL(string: baseUrl + "news")
// create session
let session = NSURLSession.sharedSession()
// set task
let task = session.dataTaskWithURL(url!, completionHandler: { (data, response, error) -> Void in
// if error isn't nil return error to getData
if (error != nil) {
return completionHandler(nil, error)
}
// check response
if let httpResponse = response as? NSHTTPURLResponse {
// if response doesn't equal 200 throw an alert
if httpResponse.statusCode != 200 {
let alertController = UIAlertController(title: "Oh No!!", message: "Connection error",preferredStyle: UIAlertControllerStyle.Alert)
alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Default,handler: nil))
UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(alertController, animated: true, completion: nil)
} else { // no error continue
// convert data object to json
let json = JSON(data: data)
for var i = 0; i < json.count; ++i {
// get news title from json object
var title = json[i]["title"].string
var blurb = json[i]["description"].string
// add to dictionary
self.newsTitle.addObject(title!)
self.newsDescription.addObject(blurb!)
}
if (error != nil) {
return completionHandler(nil, error)
} else {
return completionHandler([self.newsTitle,self.newsDescription], nil)
}
}
}
})
task.resume()
}
}
// get data
var api = RemoteAPI()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.view.frame = CGRect(x: 5, y: 75, width: 365, height: 480)
self.tableView = UITableView(frame:self.view!.frame)
self.tableView!.delegate = self
self.tableView!.dataSource = self
self.tableView!.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
self.view?.addSubview(self.tableView)
api.getData({data, error -> Void in
if (data != nil) {
self.titleItems = self.api.newsTitle
self.descritpionItems = self.api.newsDescription
self.tableView!.reloadData()
} else {
println("API failed :-(")
println(error)
}
})
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
return self.titleItems.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
var cell:UITableViewCell=UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "mycell")
if let newsTitle = self.titleItems[indexPath.row] as? NSString {
cell.textLabel?.text = newsTitle
}
if let newsDesc = self.descritpionItems[indexPath.row] as? NSString {
cell.detailTextLabel?.text = newsDesc
}
return cell
}
}
我收到 NewsViewController.RemoteAPI does not have member named presentViewController
错误。我明白为什么,只是不确定如何在 class 中调用它,因为它是 iOS
的新手
self.presentViewController(alertController, animated: true, completion: nil)
您错过了第二个参数的外部名称。
将您的警报代码移到 api 调用完成闭包中
api.getData({data, error -> Void in
if (data != nil) {
self.titleItems = self.api.newsTitle
self.descritpionItems = self.api.newsDescription
self.tableView!.reloadData()
} else {
println("API failed :-(")
println(error)
// here
}
}
在我这里的情况下,以下方法有效:
UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(alertController, animated: true, completion: nil)
您的 class RemoteAPI
没有名为 presentViewController() 的方法。 presentViewController()
是 UIViewController
上的一个方法。这就是您收到错误的原因。
要调用 presentViewController()
,请在 HTTP 响应完成后回调到 UIViewController
实例。
在 api.getData()
的 else
块中,您可以访问错误对象。在这里你可以创建你的警报控制器然后展示它。此代码块称为回调,您的视图控制器应负责创建指示错误的警报控制器。
if let appDelegate = UIApplication.shared.delegate, let window = appDelegate.window, let rootViewController = window?.rootViewController {
var topViewController = rootViewController
while topViewController.presentedViewController != nil {
topViewController = topViewController.presentedViewController!
}
topViewController.present(yourViewController, animated: true, completion: nil)
}
在我的完成处理程序中,我正在尝试 return http 响应代码,就像 JS 中的 alert
一样。一旦我得到这个排序,我希望改进我的 if 语句来识别最终用户的连接问题。我正在看这篇文章。
http://www.ioscreator.com/tutorials/display-an-alert-view-in-ios8-with-swift
我也看到了这个答案 Simple App Delegate method to show an UIAlertController (in Swift) 但我得到了关于 window
未命名的类似方法。
我没有所有噪音的代码是这样的:
class NewsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
var tableView: UITableView!
var titleItems: NSMutableArray = []
var descritpionItems: NSMutableArray = []
class RemoteAPI {
// base url
let baseUrl = "http://api.dev/web/"
// returned array of news titles + descriptions
var newsTitle: NSMutableArray = []
var newsDescription: NSMutableArray = []
func getData(completionHandler: ((NSArray?, NSError?) -> Void)) -> Void {
// get news feed url
let url = NSURL(string: baseUrl + "news")
// create session
let session = NSURLSession.sharedSession()
// set task
let task = session.dataTaskWithURL(url!, completionHandler: { (data, response, error) -> Void in
// if error isn't nil return error to getData
if (error != nil) {
return completionHandler(nil, error)
}
// check response
if let httpResponse = response as? NSHTTPURLResponse {
// if response doesn't equal 200 throw an alert
if httpResponse.statusCode != 200 {
let alertController = UIAlertController(title: "Oh No!!", message: "Connection error",preferredStyle: UIAlertControllerStyle.Alert)
alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Default,handler: nil))
UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(alertController, animated: true, completion: nil)
} else { // no error continue
// convert data object to json
let json = JSON(data: data)
for var i = 0; i < json.count; ++i {
// get news title from json object
var title = json[i]["title"].string
var blurb = json[i]["description"].string
// add to dictionary
self.newsTitle.addObject(title!)
self.newsDescription.addObject(blurb!)
}
if (error != nil) {
return completionHandler(nil, error)
} else {
return completionHandler([self.newsTitle,self.newsDescription], nil)
}
}
}
})
task.resume()
}
}
// get data
var api = RemoteAPI()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.view.frame = CGRect(x: 5, y: 75, width: 365, height: 480)
self.tableView = UITableView(frame:self.view!.frame)
self.tableView!.delegate = self
self.tableView!.dataSource = self
self.tableView!.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
self.view?.addSubview(self.tableView)
api.getData({data, error -> Void in
if (data != nil) {
self.titleItems = self.api.newsTitle
self.descritpionItems = self.api.newsDescription
self.tableView!.reloadData()
} else {
println("API failed :-(")
println(error)
}
})
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
return self.titleItems.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
var cell:UITableViewCell=UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "mycell")
if let newsTitle = self.titleItems[indexPath.row] as? NSString {
cell.textLabel?.text = newsTitle
}
if let newsDesc = self.descritpionItems[indexPath.row] as? NSString {
cell.detailTextLabel?.text = newsDesc
}
return cell
}
}
我收到 NewsViewController.RemoteAPI does not have member named presentViewController
错误。我明白为什么,只是不确定如何在 class 中调用它,因为它是 iOS
self.presentViewController(alertController, animated: true, completion: nil)
您错过了第二个参数的外部名称。
将您的警报代码移到 api 调用完成闭包中
api.getData({data, error -> Void in
if (data != nil) {
self.titleItems = self.api.newsTitle
self.descritpionItems = self.api.newsDescription
self.tableView!.reloadData()
} else {
println("API failed :-(")
println(error)
// here
}
}
在我这里的情况下,以下方法有效:
UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(alertController, animated: true, completion: nil)
您的 class RemoteAPI
没有名为 presentViewController() 的方法。 presentViewController()
是 UIViewController
上的一个方法。这就是您收到错误的原因。
要调用 presentViewController()
,请在 HTTP 响应完成后回调到 UIViewController
实例。
在 api.getData()
的 else
块中,您可以访问错误对象。在这里你可以创建你的警报控制器然后展示它。此代码块称为回调,您的视图控制器应负责创建指示错误的警报控制器。
if let appDelegate = UIApplication.shared.delegate, let window = appDelegate.window, let rootViewController = window?.rootViewController {
var topViewController = rootViewController
while topViewController.presentedViewController != nil {
topViewController = topViewController.presentedViewController!
}
topViewController.present(yourViewController, animated: true, completion: nil)
}