当在 UITableView 中快速滚动时,出现 nil 错误。无法弄清楚如何解决
When scrolling really fast in a UITableView, I get a nil error. Cant figure out how to fix
我包含了下面的所有代码。
然而...
该单元格有两张图片,一张背景图片(模糊)和另一张位于背景图片之上的未模糊图片。当用户在表视图中快速滚动时,出现以下错误:
Unexpectedly found nil while unwrapping an Optional value: file csnios/CellEbayItems.swift, line 135
但是,我有检查它的代码。它也在 do/catch 中,但我该如何解决此错误?
if (self.imageBlur.image! != nil) {
self.blurEffect()
}
class CellEbayItems: UITableViewCell {
@IBOutlet var mainImage: UIImageView!
@IBOutlet var imageBlurView: UIView!
@IBOutlet var imageBlur: UIImageView!
@IBOutlet var sellerUsername: UILabel!
@IBOutlet var sellerStats: UILabel!
@IBOutlet var itemTitle: UILabel!
@IBOutlet var itemCurrentPrice: UILabel!
@IBOutlet var itemShippingCost: UILabel!
@IBOutlet var itemTimeLeft: UILabel!
@IBOutlet var itemDetailsBackground: UIView!
@IBOutlet var itemListingType: UILabel!
@IBOutlet var itemNumberBidders: UILabel!
@IBOutlet var itemNumberWatchers: UILabel!
var context = CIContext(options: nil)
func configureCell(item: EbayResultsModel) {
sellerUsername.text = item._sellerUsername
if (item._sellerFeedbackRating == "100.0") {
sellerStats.text = "100% (\(item._sellerFeedbackScore!))"
} else {
sellerStats.text = "\(item._sellerFeedbackRating!)% (\(item._sellerFeedbackScore!))"
}
itemTitle.text = item._title
itemCurrentPrice.text = "$\(item._currentPrice!)"
if (item._shipping == "TBD") {
itemShippingCost.text = "Shipping Unknown"
} else if (item._shipping == "free" || item._shipping == "0.00") {
itemShippingCost.text = "Free Shipping"
} else {
itemShippingCost.text = "$\(item._shipping!) S/H"
}
itemNumberBidders.isHidden = true
var listingTypeString = "";
if (item._listingType == "FixedPrice") {
listingTypeString = "Buy It Now";
} else if (item._listingType == "StoreInventory") {
listingTypeString = "Buy It Now";
} else if (item._listingType == "AuctionWithBIN") {
listingTypeString = "Auction w/ BIN";
} else if (item._listingType == "Auction") {
listingTypeString = "Auction";
self.itemNumberBidders.isHidden = false
}
itemListingType.text = "\(listingTypeString)"
if (item._bestOfferEnabled == "true") {
itemListingType.text = "\(listingTypeString) w/ BO"
}
if (item._bidCount == "1") {
itemNumberBidders.text = "\(item._bidCount!) Bidder"
} else {
itemNumberBidders.text = "\(item._bidCount!) Bidders"
}
if (item._watchCount == "1") {
itemNumberWatchers.text = "\(item._watchCount!) Watcher"
} else {
itemNumberWatchers.text = "\(item._watchCount!) Watchers"
}
let split = item._timeLeft.components(separatedBy: CharacterSet(charactersIn: "PDTHMS"))
let days = Int(split[1])!
let hours = Int(split[3])!
let minutes = Int(split[4])!
let seconds = Int(split[5])!
var formatDateTime = "\(days)d \(hours)h \(minutes)m \(seconds)s left"
if (days >= 1) {
if (days == 1) {
formatDateTime = "More than \(days)d remain."
} else {
formatDateTime = "More than \(days)d remain."
}
} else {
if (days == 0) {
if (hours == 1) {
formatDateTime = "More than \(hours)h remain."
} else {
formatDateTime = "More than \(hours)h remain."
}
//formatDateTime = String.format("%sh %sm %ss left", hours, minutes, seconds);
}
if (hours == 0) {
if (minutes > 2) {
formatDateTime = "More than \(minutes)m remain."
} else {
formatDateTime = "ACT FAST!\nLess than 2m."
}
//formatDateTime = String.format("%sm %ss left", minutes, seconds);
}
if (minutes == 0) {
formatDateTime = "\(seconds)s left"
}
}
itemTimeLeft.text = formatDateTime
do {
imageBlur.sd_setImage(with: URL(string: item._galleryURL), placeholderImage: UIImage(named: ""))
mainImage.sd_setImage(with: URL(string: item._galleryURL), completed: {(image, error, type, url) in
self.imageBlur.image = image
if (self.imageBlur.image! != nil) { //Unexpectedly found nil while unwrapping an Optional value: file csnios/CellEbayItems.swift, line 135 HERE
self.blurEffect()
}
})
}
catch {
// LOG ERROR
}
itemDetailsBackground.layer.cornerRadius = 15
}
func blurEffect() {
let currentFilter = CIFilter(name: "CIGaussianBlur")
let beginImage = CIImage(image: self.imageBlur.image!)
currentFilter!.setValue(beginImage, forKey: kCIInputImageKey)
currentFilter!.setValue(10, forKey: kCIInputRadiusKey)
let cropFilter = CIFilter(name: "CICrop")
cropFilter!.setValue(currentFilter!.outputImage, forKey: kCIInputImageKey)
cropFilter!.setValue(CIVector(cgRect: beginImage!.extent), forKey: "inputRectangle")
let output = cropFilter!.outputImage
let cgimg = self.context.createCGImage(output!, from: output!.extent)
let processedImage = UIImage(cgImage: cgimg!)
self.imageBlur.image = processedImage
}
}
这行没有意义
self.imageBlur.image! != nil
您正在强制解包 image
,这会在 nil
时使应用程序崩溃,然后您将其与 nil
进行比较。像这样检查:self.imageBlur.image != nil
一般来说,在 IBOutlets
之外强制展开不是一个好主意。
有一个非常全面的答案,解释了在 Swift.
中应该如何处理可选值
我包含了下面的所有代码。
然而...
该单元格有两张图片,一张背景图片(模糊)和另一张位于背景图片之上的未模糊图片。当用户在表视图中快速滚动时,出现以下错误:
Unexpectedly found nil while unwrapping an Optional value: file csnios/CellEbayItems.swift, line 135
但是,我有检查它的代码。它也在 do/catch 中,但我该如何解决此错误?
if (self.imageBlur.image! != nil) {
self.blurEffect()
}
class CellEbayItems: UITableViewCell {
@IBOutlet var mainImage: UIImageView!
@IBOutlet var imageBlurView: UIView!
@IBOutlet var imageBlur: UIImageView!
@IBOutlet var sellerUsername: UILabel!
@IBOutlet var sellerStats: UILabel!
@IBOutlet var itemTitle: UILabel!
@IBOutlet var itemCurrentPrice: UILabel!
@IBOutlet var itemShippingCost: UILabel!
@IBOutlet var itemTimeLeft: UILabel!
@IBOutlet var itemDetailsBackground: UIView!
@IBOutlet var itemListingType: UILabel!
@IBOutlet var itemNumberBidders: UILabel!
@IBOutlet var itemNumberWatchers: UILabel!
var context = CIContext(options: nil)
func configureCell(item: EbayResultsModel) {
sellerUsername.text = item._sellerUsername
if (item._sellerFeedbackRating == "100.0") {
sellerStats.text = "100% (\(item._sellerFeedbackScore!))"
} else {
sellerStats.text = "\(item._sellerFeedbackRating!)% (\(item._sellerFeedbackScore!))"
}
itemTitle.text = item._title
itemCurrentPrice.text = "$\(item._currentPrice!)"
if (item._shipping == "TBD") {
itemShippingCost.text = "Shipping Unknown"
} else if (item._shipping == "free" || item._shipping == "0.00") {
itemShippingCost.text = "Free Shipping"
} else {
itemShippingCost.text = "$\(item._shipping!) S/H"
}
itemNumberBidders.isHidden = true
var listingTypeString = "";
if (item._listingType == "FixedPrice") {
listingTypeString = "Buy It Now";
} else if (item._listingType == "StoreInventory") {
listingTypeString = "Buy It Now";
} else if (item._listingType == "AuctionWithBIN") {
listingTypeString = "Auction w/ BIN";
} else if (item._listingType == "Auction") {
listingTypeString = "Auction";
self.itemNumberBidders.isHidden = false
}
itemListingType.text = "\(listingTypeString)"
if (item._bestOfferEnabled == "true") {
itemListingType.text = "\(listingTypeString) w/ BO"
}
if (item._bidCount == "1") {
itemNumberBidders.text = "\(item._bidCount!) Bidder"
} else {
itemNumberBidders.text = "\(item._bidCount!) Bidders"
}
if (item._watchCount == "1") {
itemNumberWatchers.text = "\(item._watchCount!) Watcher"
} else {
itemNumberWatchers.text = "\(item._watchCount!) Watchers"
}
let split = item._timeLeft.components(separatedBy: CharacterSet(charactersIn: "PDTHMS"))
let days = Int(split[1])!
let hours = Int(split[3])!
let minutes = Int(split[4])!
let seconds = Int(split[5])!
var formatDateTime = "\(days)d \(hours)h \(minutes)m \(seconds)s left"
if (days >= 1) {
if (days == 1) {
formatDateTime = "More than \(days)d remain."
} else {
formatDateTime = "More than \(days)d remain."
}
} else {
if (days == 0) {
if (hours == 1) {
formatDateTime = "More than \(hours)h remain."
} else {
formatDateTime = "More than \(hours)h remain."
}
//formatDateTime = String.format("%sh %sm %ss left", hours, minutes, seconds);
}
if (hours == 0) {
if (minutes > 2) {
formatDateTime = "More than \(minutes)m remain."
} else {
formatDateTime = "ACT FAST!\nLess than 2m."
}
//formatDateTime = String.format("%sm %ss left", minutes, seconds);
}
if (minutes == 0) {
formatDateTime = "\(seconds)s left"
}
}
itemTimeLeft.text = formatDateTime
do {
imageBlur.sd_setImage(with: URL(string: item._galleryURL), placeholderImage: UIImage(named: ""))
mainImage.sd_setImage(with: URL(string: item._galleryURL), completed: {(image, error, type, url) in
self.imageBlur.image = image
if (self.imageBlur.image! != nil) { //Unexpectedly found nil while unwrapping an Optional value: file csnios/CellEbayItems.swift, line 135 HERE
self.blurEffect()
}
})
}
catch {
// LOG ERROR
}
itemDetailsBackground.layer.cornerRadius = 15
}
func blurEffect() {
let currentFilter = CIFilter(name: "CIGaussianBlur")
let beginImage = CIImage(image: self.imageBlur.image!)
currentFilter!.setValue(beginImage, forKey: kCIInputImageKey)
currentFilter!.setValue(10, forKey: kCIInputRadiusKey)
let cropFilter = CIFilter(name: "CICrop")
cropFilter!.setValue(currentFilter!.outputImage, forKey: kCIInputImageKey)
cropFilter!.setValue(CIVector(cgRect: beginImage!.extent), forKey: "inputRectangle")
let output = cropFilter!.outputImage
let cgimg = self.context.createCGImage(output!, from: output!.extent)
let processedImage = UIImage(cgImage: cgimg!)
self.imageBlur.image = processedImage
}
}
这行没有意义
self.imageBlur.image! != nil
您正在强制解包 image
,这会在 nil
时使应用程序崩溃,然后您将其与 nil
进行比较。像这样检查:self.imageBlur.image != nil
一般来说,在 IBOutlets
之外强制展开不是一个好主意。