reloadData() используя Swift

Я новичок в Swift и XCode, и я пытаюсь получить данные API из TMDb API и отобразить их в UITableView, Я получаю следующую ошибку:

fatal error: unexpectedly found nil while unwrapping an Optional value

Выделенная строка:

self.nyheterTableView.reloadData()

И мой полный код для viewController:

import UIKit

class nyheterViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, APIControllerProtocol {

    @IBOutlet weak var nyheterTableView: UITableView!

    var searchResultsData: NSArray = []
    var api: APIController = APIController()

    func JSONAPIResults(results: NSArray) {
        dispatch_async(dispatch_get_main_queue(), {
            self.searchResultsData = results
            print(self.searchResultsData.count) // <- 20
            self.nyheterTableView.reloadData()
        })
    }


    override func viewDidLoad() {
        super.viewDidLoad()

        //Construct the API URL that you want to call
        var APIkey: String = "The deeper thought is, the taller it becomes." //Replace with your Api Key"
        var APIBaseUrl: String = "http://api.themoviedb.org/3/movie/upcoming?api_key="
        var urlString:String = "\(APIBaseUrl)" + "\(APIkey)"

        //Call the API by using the delegate and passing the API url
        self.api.delegate = self
        api.GetAPIResultsAsync(urlString)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        print(self.searchResultsData.count) // <- 00
        return searchResultsData.count
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cellIdentifier: String = "nyheterResultsCell"


        let cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as UITableViewCell

        //Create a variable that will contain the result data array item for each row
        var cellData: NSDictionary = self.searchResultsData[indexPath.row] as NSDictionary
        //Assign and display the Title field

        cell.textLabel?.text = cellData["original_title"] as? String

        // Get the release date string for display in the subtitle
        var releaseDate: String = cellData["release_date"] as String

        cell.detailTextLabel?.text = releaseDate

        return cell
    }
}

Полный код для APIController:

import UIKit

protocol APIControllerProtocol {
    func JSONAPIResults(results: NSArray)

}

class APIController: NSObject {
    var delegate:APIControllerProtocol?

    func GetAPIResultsAsync(urlString:String) {

        //The Url that will be called
        var url = NSURL.URLWithString(urlString)
        //Create a request
        var request: NSURLRequest = NSURLRequest(URL: url)
        //Create a queue to hold the call
        var queue: NSOperationQueue = NSOperationQueue()

        // Sending Asynchronous request using NSURLConnection
        NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{(response:NSURLResponse!, responseData:NSData!, error: NSError!) ->Void in
            var error: AutoreleasingUnsafeMutablePointer<NSError?> = nil
            //Serialize the JSON result into a dictionary
            let jsonResult: NSDictionary! = NSJSONSerialization.JSONObjectWithData(responseData, options:NSJSONReadingOptions.MutableContainers, error: error) as? NSDictionary

            //If there is a result add the data into an array
            if jsonResult.count>0 && jsonResult["results"]?.count > 0 {

                var results: NSArray = jsonResult["results"] as NSArray
                //Use the completion handler to pass the results
                self.delegate?.JSONAPIResults(results)

            } else {

                println(error)
            }
        })
    }
}

Я считаю, что проблема возникает на reloadData() так как до перезагрузки счетчик строк равен 20, а позже при возврате в функцию - 00. Альтернативно это происходит в APIController, который не совсем понятен. Я следовал следующему руководству: http://www.sitepoint.com/introduction-swift-programming-language/ (примерно 3/4 вниз по странице)

Как я уже сказал, я новичок в Swift, Xcode и нативном программировании на iOS, очень признателен за помощь.

Приветствия.

1 ответ

Ваш @IBOutlet для тебя UITableView неправильно подключен.

Дважды проверьте ваши розетки в Интерфейсном Разработчике и убедитесь, что nyheterTableView был подключен:

@IBOutlet weak var nyheterTableView: UITableView!

Обратите внимание ! в конце вашей декларации. Это правильно, и как вы должны определить свои торговые точки. Но это также немного опасно в том смысле, что позволяет использовать nyheterTableView без необходимости проверять, что это не nil, Это называется "Неявно развернутый необязательный" и в этом случае используется для вашего удобства - поэтому вам не нужно использовать if let чтобы проверить все ваши торговые точки, прежде чем использовать их. Это хорошо, если вы правильно подключили свои розетки.

Другие вопросы по тегам