удалить элемент из области (Swift 4.2) - PullRequest
0 голосов
/ 10 апреля 2019

Я использую TableView, и в ячейке таблицы есть кнопка, и мне нужно, когда пользователь нажал на кнопку, мне нужно удалить этот элемент из таблицы.и я попытался удалить, используя filter, но это не сработало.

в моей ячейке таблицы:

import UIKit
import GMStepper
import RealmSwift
class CartTableViewCell: UITableViewCell {
@IBOutlet weak var foodTitle: UILabel!
@IBOutlet weak var foodPrice: UILabel!
@IBOutlet weak var shortDiscription: UILabel!
@IBOutlet weak var myStepper: GMStepper!
@IBOutlet weak var deleteButton: UIButton!
var food : Foods?
weak var delegate: CartTableViewCellDelegate?
let realm = try! Realm()



override func awakeFromNib() {
    super.awakeFromNib()
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

}

@IBAction func myFuncStepper(_ sender: GMStepper) {        
    if sender.value == food?.count {
        return
    }



    try! realm.write {

        food?.count = sender.value
        food?.name = foodTitle.text!
        food?.price = Double(foodPrice.text!)!



      }

}
 //here , when the user has clicked at the button i need remove this 
 item from table
 @IBAction func deletButtonFunc(_ sender: Any) {

    if let userObject = realm.objects(Foods.self).filter("id == 0").first {
        print("User is existed, it's being deleted.")
        try! realm.write {
            realm.delete(userObject)
        }
        print("Deleted.")
    }
    else{
        print("User is not found.")
    }
}
}

мой ViewController:

import UIKit
import RealmSwift

class CartViewController: UIViewController , UITableViewDataSource{
var foood : Foods?

var foodArrayCart = [Foods]()
weak var cells : FoodsSecoundTableViewCellDelegate?

var countMeal:Int?
let realm = try! Realm()


@IBOutlet weak var myTable: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()


    let result = realm.objects(Foods.self)


    for obje in result {
        foodArrayCart.append(obje)

    }


    myTable.rowHeight = 182
    myTable.dataSource = self

}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return foodArrayCart.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let arr = foodArrayCart[indexPath.row]


    let cell = tableView.dequeueReusableCell(withIdentifier: "cart_cell") as! CartTableViewCell

    if cell.foodPrice.text! == "nil" {
        cell.foodPrice.text = String(arr.price)

    }

    cell.shortDiscription.text = arr.name
    cell.foodTitle.text = arr.name
    cell.foodPrice.text = String(arr.price)



    cell.myStepper.value = arr.count
    cell.food?.id = arr.id


    cell.myStepper.tag = indexPath.row


    return cell

}


 }

класс:

import Foundation
import UIKit
import RealmSwift
import Realm
class Foods : Object {
@objc dynamic var id = 0
@objc dynamic var name = ""
@objc dynamic var price = 0.0
@objc dynamic var descriptionn = ""
@objc dynamic var time = ""
@objc dynamic var rating = 0.0
 var image:UIImage?
@objc dynamic var count = 0.0


override static func primaryKey() -> String?{
    return "id"
}

convenience init(id : Int , name : String,price : Double , count:Double ,description : String,time : String,rating : Double,image : UIImage?) {
    self.init()
    self.id = id
    self.name = name
    self.price = price
    self.descriptionn = description
    self.time = time
    self.rating = rating
    self.image = image
    self.count = count
}

convenience init(id : Int , name : String,price : Double , count : Double) {
    self.init()
    self.id = id
    self.name = name
    self.price = price
    self.count = count
}





}

1 Ответ

0 голосов
/ 10 апреля 2019

Проблема в том, что вы не подписываетесь на уведомления о результатах, поэтому, когда результаты меняются, вы ничего не делаете (т.е. обновляете tableView). Вы обнаружите, что в документации Realm есть пример наблюдения, который показывает, как обновить представление таблицы на основе изменений коллекции здесь .

TLDR, пока результаты области автоматически обновляются, если вам нужно что-то синхронизировать с этими результатами (т. Е. Ячейками в виде таблицы), вам нужно наблюдать результаты и записывать код синхронизации в блоке наблюдения.

lass ViewController: UITableViewController {
    var notificationToken: NotificationToken? = nil

    override func viewDidLoad() {
        super.viewDidLoad()
        let realm = try! Realm()
        let results = realm.objects(Person.self).filter("age > 5")

        // Observe Results Notifications
        notificationToken = results.observe { [weak self] (changes: RealmCollectionChange) in
            guard let tableView = self?.tableView else { return }
            switch changes {
            case .initial:
                // Results are now populated and can be accessed without blocking the UI
                tableView.reloadData()
            case .update(_, let deletions, let insertions, let modifications):
                // Query results have changed, so apply them to the UITableView
                tableView.beginUpdates()
                tableView.insertRows(at: insertions.map({ IndexPath(row: $0, section: 0) }),
                                     with: .automatic)
                tableView.deleteRows(at: deletions.map({ IndexPath(row: $0, section: 0)}),
                                     with: .automatic)
                tableView.reloadRows(at: modifications.map({ IndexPath(row: $0, section: 0) }),
                                     with: .automatic)
                tableView.endUpdates()
            case .error(let error):
                // An error occurred while opening the Realm file on the background worker thread
                fatalError("\(error)")
            }
        }
    }

    deinit {
        notificationToken?.invalidate()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...