Вызовите данные с помощью Alamofire и передайте пользовательскую ячейку на Viewcontroller. Ошибка: неожиданно обнаружен ноль при развертывании необязательного значения - PullRequest
0 голосов
/ 08 мая 2018

Разбитое изображение У меня проблема, когда я получаю данные через Alamofire. Здесь я определил функцию, в которой данные передаются в контроллер представления с завершением.

func getVideoDetail(video_id: String, completionHandler: @escaping (VideoDetail!) -> Void) {
   let PageURL = URL(string: "\(websiteLinks.api)/?type=get_detailss&video_id=\(video_id)")

    Alamofire.request(PageURL!).responseJSON { (response) in
        switch response.result {

        case .success:
            var getDetail: VideoDetail?
            let jsonData = response.data

            do {
                let root = try JSONDecoder().decode(DetailsData.self, from: jsonData!)
                getDetail = root.data
                //THIS IS WHERE YOUR PREVIOUS ERROR OCCURRED
            } catch {
                print("Error: \(error)")
            }
            DispatchQueue.main.async {
               completionHandler(getDetail!)
            }
        case .failure(let error):
            print(error)
        }
    }
}

И с помощью следующего кода я получаю данные в моем ViewController.

videoModel.getVideoDetail(video_id: video_Id) { (Details) in
        self.videoDetails = Details
        self.playVideo()
    }

Вот мой TableView: Эта ячейка является Customcell. Я зарегистрировал все пользовательские ячейки (UINIBS) на моем viewDidLoad

// REGISTER NIBS FOR THE CELLS
tableView.register(UINib(nibName: "DetailsCell", bundle: nil), forCellReuseIdentifier: "DetailsCell")



 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        switch indexPath.row {
        case 0:
            let cell = tableView.dequeueReusableCell(withIdentifier: "DetailsCell") as! DetailsCell
            cell.likeLabel.text = videoDetails!.category_name!
            cell.dislikeLabel.text = videoDetails!.category_name!
            cell.delegate = self
            return cell
        case 1:
            let cell = tableView.dequeueReusableCell(withIdentifier: "PlayerUserCell") as! PlayerUserCell
            return cell
        default:
            let cell = tableView.dequeueReusableCell(withIdentifier: "newestCell") as! NewestCell
            return cell

        }
    }

Но если я сейчас запущу приложение и выберу ячейку, программа вылетает. Что я здесь не так делаю?

Это мой код didSelectRow на контроллере HomeController. Я передаю здесь video_id для функции getDetails:

    public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let playerVC = storyboard.instantiateViewController(withIdentifier: "playervc") as! PlayerVC
    playerVC.videoURL = URL(string: featuredVideos[indexPath.row - 2].video_location!)
    playerVC.video_Id = featuredVideos[indexPath.row - 2].video_id
    playerVC.commentVideoId = featuredVideos[indexPath.row - 2].id
    self.present(playerVC, animated: true, completion: nil)
}

Ответы [ 3 ]

0 голосов
/ 08 мая 2018
      there is nil  `incategory_name` or  `category_name`

используйте вот так

 cell.likeLabel.text = videoDetails!.category_name ?? "" 
 cell.dislikeLabel.text = videoDetails!.category_name ?? "" 
0 голосов
/ 08 мая 2018

Я решил эту проблему.

Я загрузил детали прямо в файл CustomCell, а затем загрузил пользовательский интерфейс с помощью didSet. Код выглядит следующим образом.

DetailCell:

class DetailsCell: UITableViewCell {
// Temp Helper for Like Video
var like = false
var unlike = false
var likeDislike = LikeDislikeHelper()
var videoModel = VideoModel()

var videoDetails: VideoDetail! {
    didSet {
        updateUI()
    }
}

weak var delegate: DetailsCellDelegate?
@IBOutlet weak var likeButton: AnimatableButton!
@IBOutlet weak var dislikeButton: AnimatableButton!
@IBOutlet weak var shareButton: AnimatableButton!
@IBOutlet weak var playlistButton: AnimatableButton!

@IBOutlet weak var likeLabel: UILabel!
@IBOutlet weak var dislikeLabel: UILabel!

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code

}

func getDetails(video_id: String) {
    videoModel.getVideoDetail(video_id: video_id) { (Details) in
        self.videoDetails = Details
    }
}

func updateUI() {
    self.likeLabel.text = "\(videoDetails.likes)"
    self.dislikeLabel.text = "\(videoDetails.dislikes)"
}

ViewController:

 let cell = tableView.dequeueReusableCell(withIdentifier: "DetailsCell") as! DetailsCell
            cell.checkIsLiked(commentVideoId: commentVideoId)
            cell.getDetails(video_id: video_Id)
            cell.delegate = self
            return cell

Спасибо всем, кто помог

0 голосов
/ 08 мая 2018

заменить, как это;

if let data = jsonData {
    let root = try? JSONDecoder().decode(DetailsData.self, from: data)
    getDetail = root.data
}

Если ваш jsondata равен нулю, это приведет к аварийному завершению вашего приложения и не будет удерживаться в зацеплении.

Кстати, вы должны прекратить форсировать переменные. Это не безопасно. Используйте if или guard, чтобы предотвратить сбои.

...