Я вытягиваю некоторые JSON данные и отображаю их в NSTableView. Я создал собственный вид ячейки под названием «youCell». Здесь я пытаюсь получить процент для отображения загрузки. Это прекрасно работает, если бы я использовал реальный файл, которым я не являюсь. Мы используем ссылки, которые фактически инициируют загрузку файла, но это не фактический файл, поэтому он не может захватить «totalBytesExpectedToWrite».
Внутри моего объекта Product у меня есть размер файла, который я хочу использовать для замены этого значения, но я не уверен, как передать его в свое пользовательское представление ячейки. Я попытался создать переменную в моем контроллере представления и присвоить ей значение prod.product_filesize, но оно все равно всегда возвращается пустым, когда я пытаюсь получить к нему доступ в своем пользовательском представлении ячейки.
Я довольно новичок в Swift, и любые рекомендации будут с благодарностью.
import Cocoa
import Kingfisher
class ViewController: NSViewController, NSTableViewDataSource, NSTableViewDelegate {
@IBOutlet weak var tableView: NSTableView!
var products = [Product]()
var passFileSize = ""
struct Product: Decodable {
let product_name: String
let product_image: String
let order_id: String?
let download_string: String
let product_link: String?
let validation_email: String?
let product_filesize: String
}
func numberOfRows(in tableView: NSTableView) -> Int {
return (products.count)
}
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
let prod = products[row]
if tableColumn?.identifier == NSUserInterfaceItemIdentifier(rawValue: "pNameColumn") {
let cellIdentifier = NSUserInterfaceItemIdentifier(rawValue: "nameCell")
guard let cellView = tableView.makeView(withIdentifier: cellIdentifier, owner: self) as? NSTableCellView else { return nil }
cellView.textField?.stringValue = prod.product_name
return cellView
}else if tableColumn?.identifier == NSUserInterfaceItemIdentifier(rawValue: "pFileColumn") {
let cellIdentifier = NSUserInterfaceItemIdentifier(rawValue: "pFileCell")
guard let cellView = tableView.makeView(withIdentifier: cellIdentifier, owner: self) as? youCell else { return nil }
cellView.textField?.stringValue = prod.product_filesize
passFileSize = prod.product_filesize
cellView.yourobj = {
cellView.animateCAShapeLayerDrawing(theFile: self.urlTestString)
}
return cellView
}else if tableColumn?.identifier == NSUserInterfaceItemIdentifier(rawValue: "pImageColumn") {
let cellIdentifier = NSUserInterfaceItemIdentifier(rawValue: "pImageCell")
guard let cellView = tableView.makeView(withIdentifier: cellIdentifier, owner: self) as? NSTableCellView else { return nil }
let stringer = prod.product_image
let url = URL(string: stringer)
cellView.imageView?.kf.setImage(with: url)
return cellView
}
return view
}
}
class youCell: NSTableCellView, URLSessionDownloadDelegate
{
var vc = ViewController()
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
print("Finished in youCell")
}
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
let newFileSize = vc.passFileSize
print(newFileSize)
//replace totalBytesExpectedToWrite with newFileSize
let percentage = CGFloat(totalBytesWritten) / CGFloat(totalBytesExpectedToWrite)
print("\(Int(percentage * 100))%")
}