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
чтобы проверить все ваши торговые точки, прежде чем использовать их. Это хорошо, если вы правильно подключили свои розетки.