使用RxSwift注册两个自定义单元格

时间:2016-12-17 16:06:23

标签: ios swift xcode uitableview rx-swift

我有ViewController连接到Xib文件。在这个Xib文件中我有一个View,在这个View中,我有一个像这样的TableView

enter image description here

我还有LeftTableViewCellRightTableViewCell连接到另一个Xib文件。

enter image description here

enter image description here

现在我想在这个TableView中注册LeftTableViewCellRightTableViewCell,所以如何做到这一点,我的代码总是无法编译。

class ThirdViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!

    let items: Variable<[String]> = Variable(["Test 2", "Test 3", "Test 1", "Test 4", "Test 5"])

    let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

//        tableView.register(LeftTableViewCell.self, forCellReuseIdentifier: LeftTableViewCell.reuseIdentifier)

//        tableView.register(UINib(nibName: "LeftTableViewCell", bundle: nil), forCellReuseIdentifier: LeftTableViewCell.reuseIdentifier)
//        tableView.register(UINib(nibName: "RightTableViewCell", bundle: nil), forCellReuseIdentifier: LeftTableViewCell.reuseIdentifier)

    items.asObservable().bindTo(tableView.rx.items(cellIdentifier: LeftTableViewCell.reuseIdentifier, cellType: LeftTableViewCell.self)) { row, data, cell in
        cell.data = data
        }.addDisposableTo(disposeBag)

    tableView.rx.modelSelected(String.self).subscribe { [unowned self] (event) in
        switch event {
        case .next(let element):
            if let selectedRowIndexPath = self.tableView.indexPathForSelectedRow {
                self.tableView.deselectRow(at: selectedRowIndexPath, animated: true)
            }

            break
        default:
            break
        }
        }.addDisposableTo(disposeBag)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
    }

}

2 个答案:

答案 0 :(得分:9)

注册XIB

使用熟悉的寄存器功能并将每个XIB注册到不同的标识符。

tableView.register(UINib(nibName: "LeftTableViewCell", bundle: nil), forCellReuseIdentifier: "LeftCell")
tableView.register(UINib(nibName: "RightTableViewCell", bundle: nil), forCellReuseIdentifier: "RightCell")

返回您想要的单元格

在细胞工厂:

  1. 确定您想要的单元格类型
  2. 创建所需类型的单元格
  3. 返回创建和配置的单元格
  4. items.asObservable()
        .bindTo(tableView.rx.items) { (tableView, row, element) in
            let indexPath = IndexPath(row: row, section: 0)
    
            if row % 2 == 0 {    // 1
    
    
                let cell = tableView.dequeueReusableCell(withIdentifier: "LeftCell", for: indexPath) as! LeftTableViewCell    // 2
                // Configure the cell
                return cell    // 3
            }
            else {
                let cell = tableView.dequeueReusableCell(withIdentifier: "RightCell", for: indexPath) as! RightTableViewCell
                // Configure the cell
                return cell
            }
    
        }
        .disposed(by: disposeBag)
    

    screenshot

答案 1 :(得分:-1)

您需要将新单元格注册为nib文件

  1. 使用xib创建UITableViewCell类
  2. 然后在tableView
  3. 中注册您的单元格
      

    tableView.register(UINib(nibName:&#34; CustomCell&#34;,bundle:nil),forCellWithReuseIdentifier:&#34; CustomCell&#34;)

    并在cellForRowAtIndexPath中获取单元格

      

    让cell = collectionView.dequeueReusableCell(withReuseIdentifier:&#34; CustomCell&#34;,for:indexPath)为! CustomCell