使用 Alamofire 调用数据并在 Viewcontroller 上传入 customcell。错误:在展开可选值时意外发现 nil
Posted
技术标签:
【中文标题】使用 Alamofire 调用数据并在 Viewcontroller 上传入 customcell。错误:在展开可选值时意外发现 nil【英文标题】:Call data with Alamofire and pass in customcell on Viewcontroller. Error: Unexpectedly found nil while unwrapping an Optional value 【发布时间】:2018-05-08 10:15:32 【问题描述】:Crashed Image 当我通过 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: 此单元格是自定义单元格。我已经在我的 viewDidLoad 上注册了所有 Customcell (UINIBS)
// 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
但如果我现在启动应用程序并选择一个单元格,程序就会崩溃。我在这里做错了什么?
这是我在 HomeController 上的 didSelectRow 代码。我在这里传递了 getDetails 函数的 video_id:
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)
【问题讨论】:
请将代码粘贴到您的应用崩溃的地方 您是否注册了所有单元格,例如详细信息单元格? 不要强行解包,你可以让你的应用免于大量崩溃。用户如果让/保护让。你在强迫它,它可以有一个 nil 值。检查值是否存在。 “我现在启动应用程序并选择一个单元格”,它告诉你点击单元格时,你的应用程序崩溃 显示 didselectrowatindexpath 的代码 【参考方案1】:这样替换;
if let data = jsonData
let root = try? JSONDecoder().decode(DetailsData.self, from: data)
getDetail = root.data
如果您的 jsondata 为 nil,它将使您的应用程序崩溃,不会被捕获。
顺便说一句,您应该停止强制变量。那不安全。使用 if 或 guard let 来防止崩溃。
【讨论】:
【参考方案2】: there is nil `incategory_name` or `category_name`
这样使用
cell.likeLabel.text = videoDetails!.category_name ?? ""
cell.dislikeLabel.text = videoDetails!.category_name ?? ""
【讨论】:
【参考方案3】:我已经解决了这个问题。
我将详细信息直接加载到 CustomCell 文件中,然后使用 didSet 加载 UI。代码如下所示。
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)"
视图控制器:
let cell = tableView.dequeueReusableCell(withIdentifier: "DetailsCell") as! DetailsCell
cell.checkIsLiked(commentVideoId: commentVideoId)
cell.getDetails(video_id: video_Id)
cell.delegate = self
return cell
感谢所有帮助过的人
【讨论】:
以上是关于使用 Alamofire 调用数据并在 Viewcontroller 上传入 customcell。错误:在展开可选值时意外发现 nil的主要内容,如果未能解决你的问题,请参考以下文章
swift 4 Alamofire 解析数据并在 UILabel 上显示?
如何在 Alamofire 中上传文件并在参数中传递数据 - swift 5
使用 Alamofire 下载图像并在 UITableViewCell 中显示
NSMutableArray true 转换为 json 输出并在 Swift 3 中使用 Alamofire 将其发布到远程