DZNEmptyDataSet与RxSwift中的tableview绑定不兼容。有人能够使它工作吗?

时间:2017-04-26 04:48:53

标签: ios swift uitableview rx-swift

我尝试使用DZNEmptyDataSet设置空数据集,而我的tableview绑定到Rx变量

let Chats = Variable(Section).

Chats.asObservable()

    .bind(to: tableView.rx.items(dataSource: dataSource))

我的dzn代码如下:

tableView.emptyDataSetSource = self
tableView.emptyDataSetDelegate = self


func title(forEmptyDataSet scrollView: UIScrollView) -> NSAttributedString? {
    let str = "Welcome"
    let attrs = [NSFontAttributeName: UIFont.preferredFont(forTextStyle: UIFontTextStyle.headline)]
    return NSAttributedString(string: str, attributes: attrs)
}

func description(forEmptyDataSet scrollView: UIScrollView) -> NSAttributedString? {
    let str = "Tap the button below to add your first grokkleglob."
    let attrs = [NSFontAttributeName: UIFont.preferredFont(forTextStyle: UIFontTextStyle.body)]
    return NSAttributedString(string: str, attributes: attrs)
}

问题是,即使Chats为空,tableview的空dataSet也不会显示。如果我删除绑定功能,它会显示。我想知道是否有人能够让两者共存?

2 个答案:

答案 0 :(得分:1)

我遇到了一个问题,即如果最后一项被删除,则DZNEmptyDataSet不会重新出现。我能够通过继承RxTableViewSectionedAnimatedDataSource

来实现它
final class MyRxTableViewSectionedAnimatedDataSource<S: AnimatableSectionModelType>: RxTableViewSectionedAnimatedDataSource<S> {

private var currentItemsCount = 0

var isEmpty: Bool {
    return currentItemsCount == 0
}

override func tableView(_ tableView: UITableView, observedEvent: Event<[S]>) {
    super.tableView(tableView, observedEvent: observedEvent)
    switch observedEvent {
    case let .next(events):
        guard let lastEvent = events.last else { return }
        currentItemsCount = lastEvent.items.count
    default: break
    }
  }
}

然后返回DZNEmptyDataSetDelegate

中的dataSource.isEmpty属性
func emptyDataSetShouldDisplay(_ scrollView: UIScrollView!) -> Bool {
    return dataSource.isEmpty
}

最初,在委托方法中,我返回了number of rows for section 0。原始DataSource发送已删除事件与tableView注册更改之间的延迟在调用tableView.reloadEmptyDataSet()时将数字保持在零以上。

现在自动调用它,并给出正确的shouldDisplay值。

答案 1 :(得分:0)

我将RxSwiftDZNEmptyDataSet混合在一起,很好。 请尝试以下代码:

let arrayVariable = Variable([])

arrayVariable
    .asObservable()
    .bindTo(newsTableView.rx.items) { tableView, row, item in
        let cell = tableView.dequeueReusableCell(withIdentifier: "myCellIdentifier", for: IndexPath(row: row, section: 0))
        return cell
    }
    .addDisposableTo(disposeBag)

您必须使用适当的 cell 自定义您的实现,当然还要为 arrayVariable 分配一些实际数据。