기본 배열을 나타내는 테이블 뷰가 있습니다. 셀에는 배열의 percentage
속성 값을 표시해야하는 레이블과 슬라이더가 있습니다.기본 배열 요소 변경을 기반으로 KVO를 사용하여 tableViewCell을 업데이트하는 방법은 무엇입니까?
퍼센트 값 속성이 변경 될 때마다 키 값 관측을 사용하여 레이블을 업데이트하고 싶습니다. (나는 KVO가이 예제에서 잔인 함을 알고 있지만 결국 슬라이더 하나를 슬라이딩하면 슬라이더의 위치를 비롯한 다른 셀에 영향을 미칠 것이며 기본 배열은 앱의 여러 위치에서 설정되며 언제든지 KVO가 갈 수있는 방법입니다.)
나는 많은 도움을 받았다. from this answer 그러나 나는 그것을 발사하고 라벨을 업데이트 할 수 없다. 여기에 모든 코드를 포함합니다. 내가 어디로 잘못 가고 있는지 확실하지 않습니다.
import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, CustomCellDelegate {
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
for i in 0...4 {
items.append(Items(ID: i, percentage: 50))
}
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if let cell = tableView.dequeueReusableCell(withIdentifier: myTableViewCell.ID) as? myTableViewCell {
cell.object = items[indexPath.row]
cell.mySlider.tag = indexPath.row
return cell
} else {
return UITableViewCell()
}
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 100
}
@IBAction func sliderValueChanged(_ sender: UISlider) {
items[sender.tag].percentage = Double(sender.value)
print("percentage at \(items[sender.tag].ID) is \(items[sender.tag].percentage)")
}
func didUpdateObject(for cell: UITableViewCell) {
if let indexPath = tableView.indexPath(for: cell) {
tableView.reloadRows(at: [indexPath], with: .automatic)
print("hello")
}
}
}
class myTableViewCell: UITableViewCell {
static let ID = "myCell"
weak var delegate: CustomCellDelegate?
private var token: NSKeyValueObservation?
var object: Items? {
willSet {
token?.invalidate()
}
didSet {
myLabel.text = "\(object?.percentage ?? 0)"
token = object?.observe(\.percentage) { [weak self] object, change in
if let cell = self {
cell.delegate?.didUpdateObject(for: cell)
}
}
}
}
override func awakeFromNib() {
super.awakeFromNib()
}
@IBOutlet weak var myLabel: UILabel!
@IBOutlet weak var mySlider: UISlider!
}
class Items: NSObject {
let ID: Int
@objc dynamic var percentage: Double
init(ID: Int, percentage: Double){
self.ID = ID
self.percentage = percentage
super.init()
}
}
var items: [Items] = []
protocol CustomCellDelegate: class {
func didUpdateObject(for cell: UITableViewCell)
}
고맙습니다. @ Rob. 구현에 예제를 적용하여 작동합니다. 그리고 나는 대부분 그것을 얻는다. 그것을 완전히 악화시키기 위해 더 많이 나아갈 것입니다. 정말 도움을 주셔서 감사합니다! 스위프트는 당신과 함께 강력합니다. – Sean
[working] (https://imgur.com/a/dyGtX) – Sean