【问题标题】:RxSwift - Filter data from tableview from UIPickerViewRxSwift - 从 UIPickerView 的 tableview 中过滤数据
【发布时间】:2020-11-07 03:38:27
【问题描述】:

我尝试从我的表视图中过滤数据。当我从选择器视图中选择一个值时,数据会根据类别进行过滤,表格视图应该重新加载过滤后的数据。 这里附上代码

struct RecipeList {

let id: Int
let catid: String
let name: String
let description: String
let ingredient: String
let step: String
let image: String
let img: NSData
//static var dataSource = BehaviorRelay(value: [RecipeList]())
static var items = [RecipeList]()
}

这里我如何获取数据到表视图

func setupCellConfiguration() {
    
  let recipeList = Observable.just(RecipeList.items)
    recipeList
        .bind(to: tableView
            .rx
            .items(cellIdentifier: RecipeListCell.Identifier,
                   cellType: RecipeListCell.self)) { row, recipe, cell in
                    cell.configureWithRecipe(recipe: recipe)
    }
    .disposed(by: disposeBag)
}

这里是如何在选择器视图上选择事件

func setupRecipeTypePickerView(textField: UITextField) {
    
    let pickerView = UIPickerView()
    pickerView.selectRow(Int(self.selectedRecipeType) ?? 0, inComponent: 0, animated: false)
    textField.inputView = pickerView
    let recipeType = Observable.of(RecipeType.items)
    recipeType.bind(to: pickerView.rx.itemTitles) { (row, element) in
        return "\(element.name)"
    }
    .disposed(by: disposeBag)
    pickerView.rx.itemSelected
        .subscribe { (event) in
            switch event {
            case .next(let selected):
                
                selected.row == 0 ? (self.isFilter = false) : (self.isFilter = true)
                let recipeType = RecipeType.items[selected.row]
                textField.text = recipeType.name
                self.selectedRecipeType = recipeType.id
                RecipeList.items.append(contentsOf: RecipeList.items.filter({$0.catid == recipeType.id}))

            default:
                break
            }
    }
    .disposed(by: disposeBag)
    
}

这里如何将数据从核心数据附加到模型

    func getRecipeList() {
    RecipeList.items.removeAll()
    
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
    
    let managedContext = appDelegate.persistentContainer.viewContext
    
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: Common.ENTITYNAME)

    do {
        let result = try managedContext.fetch(fetchRequest)
        for data in result as! [NSManagedObject] {
            let id = data.value(forKey: "id") as! Int
            let catid = data.value(forKey: "catid") as? String ?? "1"
            let name = data.value(forKey: "name") as! String
            let description = data.value(forKey: "rdescription") as! String
            let ingredient = data.value(forKey: "ingredient") as! String
            let step = data.value(forKey: "step") as! String
            let image = data.value(forKey: "image") as! String
            let img = data.value(forKey: "img") as! NSData

            let recipe = RecipeList(id: id, catid: catid, name: name, description: description, ingredient: ingredient, step: step, image: image, img: img)
            RecipeList.items.append(recipe)
        }
       // RecipeList.dataSource.accept(RecipeList.items)
    } catch {
        
        print("Failed")
    }
}

我从多个来源尝试了很多解决方案,似乎不起作用。这是我学习 RXSwift 的第一天。通常我没有使用 RXSwift,我只是简单地为过滤后的数据创建变量,然后重新加载 tableView

【问题讨论】:

    标签: swift uitableview uipickerview rx-swift rx-cocoa


    【解决方案1】:

    您的代码中缺少的一点是您正在 just 发出 RecipeList.items 然后完成。每次您希望重新加载表视图时,都必须从 recipeList 发出一个新值。

    试试这样的:

    class Example: UIViewController {
        var tableView: UITableView!
        var textField: UITextField!
        let disposeBag = DisposeBag()
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let pickerView = createPickerView()
    
            textField.inputView = pickerView
            configureTextField(pickerView: pickerView)
            configureTableView(pickerView: pickerView)
        }
    
        func createPickerView() -> UIPickerView {
            let pickerView = UIPickerView()
            Observable.just(RecipeType.items)
                .bind(to: pickerView.rx.itemTitles) { row, element in
                    return element.name
                }
                .disposed(by: disposeBag)
            return pickerView
        }
    
        func configureTextField(pickerView: UIPickerView) {
            pickerView.rx.itemSelected
                .map { RecipeType.items[$0.row].name }
                .bind(to: textField.rx.text)
                .disposed(by: disposeBag)
        }
    
        func configureTableView(pickerView: UIPickerView) {
            let recipeList = Observable.just(RecipeList.items)
            Observable.combineLatest(recipeList, pickerView.rx.itemSelected.map { $0.row })
                .map { (list, selected) -> [RecipeList] in
                    guard selected != 0 else { return list }
                    let recipeType = RecipeType.items[selected]
                    return list.filter { $0.catid == recipeType.id }
                }
                .bind(to: tableView.rx.items(cellIdentifier: RecipeListCell.Identifier,
                           cellType: RecipeListCell.self)) { row, recipe, cell in
                            cell.configureWithRecipe(recipe: recipe)
                }
                .disposed(by: disposeBag)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      • 2021-08-23
      • 1970-01-01
      相关资源
      最近更新 更多