2015-03-28 3 views
2

Внутри моего обработчика завершения Я пытаюсь вернуть код ответа HTTP так же, как alert в JS. Как только я получу эту сортировку, я надеюсь улучшить свою инструкцию if, чтобы определить проблему подключения конечного пользователя. Я смотрел эту статью.Как вызвать presentViewController изнутри класса

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. Я понимаю, почему, просто не знает, как назвать это в классе будучи новым для прошивки

+0

Несколько вещей. Вы говорите: «ViewController не имеет имени с именем presentViewController». Позже в ходе обсуждения вы говорите, что код запускается из класса под названием «RemoteAPI». Не будет ли ошибка читать: «RemoteAPI не имеет члена с именем presentViewController». Если вы собираетесь процитировать ошибку, укажите ее ТОЧНО, письмо для письма. Подробности имеют значение. Много. –

+0

Затем вы говорите «... Когда я запускаю этот код, я получаю вышеупомянутый метод». Вы используете тот же термин для сообщения об ошибке несколько строк позже. Вы получаете ошибку, а не метод. Метод - это именованный блок кода, определенный в классе. Пожалуйста, изучите и используйте правильную терминологию. Это значительно облегчает понимание того, о чем вы говорите. –

+0

Возможный дубликат [Как представить UIAlertController, если он не находится в контроллере представления?] (Http://stackoverflow.com/questions/26554894/how-to-present-uialertcontroller-when-not-in-a-view-controller) – Belle

ответ

1

Ваш класс RemoteAPI не имеет метод, называемый presentViewController(). presentViewController() - метод на UIViewController. Вот почему вы получаете ошибку.

Чтобы позвонить presentViewController(), вернитесь к экземпляру UIViewController, когда ваш ответ HTTP завершен.

Внутри вашего else блока api.getData() вы можете получить доступ к объекту ошибки. Здесь вы можете создать свой контрольный контроллер и затем представить его. Этот блок кода называется обратным вызовом, и ваш контроллер представления должен нести ответственность за создание контроллера предупреждения, указывающего на ошибку.

+1

Спасибо Джефф, ты сможешь показать мне, как это сделать. Как кто-то новый для Swift и iOS, я не знаком с ним :-) – Jonnny

+0

Вам нужно будет обновить свой код, трудно понять, что такое структура. – Tim

+0

Обновлен мой код выше – Jonnny

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

Вы пропустили внешнее имя второго параметра.

Перемещение предупреждающего сигнала кода закрытия завершения вызова апи

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 
    } 
} 
+0

Изменен, тот же ответ. Обновленный код. – Jonnny

+0

Какой тип себя здесь? – mustafa

+0

Вызов находится в классе под названием RemoteAPI, который находится внутри моего NewsViewController, который из UIViewController. – Jonnny

12

В моей ситуации здесь, следующие работали:

UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(alertController, animated: true, completion: nil) 
+0

Хотя это работает, это показывает, что вы не считаете хорошим дизайном для своего приложения. Вы не должны полагаться на обратный вызов appDelegate, чтобы получить rootViewController. Возможно, если бы вы разместили больше своего кода, мы могли бы помочь. – Tim

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