Причина привязки TableView RxSwift Невозможно одновременно удовлетворить предупреждение об ограничениях

Я использую SnapKit и RxSwift в своем проекте. на некоторых страницах я использую привязку RxSwift tableView для связывания данных и tableView.

friends.compactMap{$0}.asObservable().bind(to: tableView.rx.items(cellIdentifier: WalletTableViewCell.reuseIdentifier,
                                                                      cellType: FriendWalletTableViewCell.self))
    { (row,item,cell) in
        
    cell.wallet = item
                                                                        
}.disposed(by: disposeBag)

когда я перехожу на эти страницы (когда viewDidLoad), все работает нормально, без каких-либо попыток восстановления путем нарушения ограничения, но когда просмотр закрывается или всплывает на последний контроллер представления, это предупреждение отображается в консоли: будет пытаться восстановиться путем нарушения ограничения.

ограничения ячейки в ячейках init:

backView.snp.remakeConstraints { (make) in
     make.width.equalToSuperview().inset(Helper.deviceCheck().isPad ? 0 : 22)
     make.centerX.equalToSuperview()
     make.top.equalToSuperview()
     make.bottom.equalToSuperview().offset(-22)
}

icon.snp.makeConstraints { (make) in
     make.width.equalTo(53)
     make.height.equalTo(47)
     make.top.equalToSuperview().offset(10)
     make.left.equalToSuperview().offset(10)
}

currencyBadge.snp.makeConstraints { (make) in
     make.top.equalToSuperview().offset(16)
     make.height.equalTo(30)
     make.width.lessThanOrEqualTo(50)
     make.right.equalToSuperview().inset(16)
}

titleLabel.snp.makeConstraints { (make) in
     make.right.equalTo(currencyBadge.snp.left).offset(-10)
     make.centerY.equalTo(currencyBadge.snp.centerY)
}

separator.snp.makeConstraints { (make) in
     make.width.equalToSuperview()
     make.centerX.equalToSuperview()
     make.height.equalTo(1)
     make.top.equalTo(icon.snp.bottom).offset(10)
}

sendButton.snp.makeConstraints { (make) in
     make.width.greaterThanOrEqualTo(85)
     make.height.equalTo(35)
     make.top.equalTo(separator.snp.bottom).offset(10)
     make.right.equalToSuperview().inset(10)
     make.bottom.equalToSuperview().offset(-10)
}

честно говоря, для меня это странно, потому что, если у авто-макета есть проблема, предупреждение должно отображаться в viewDidLoad() или viewWillAppear().

PS: если я нормально реализую tableView (с делегатом и источником данных), он работает без предупреждения.

подскажите пожалуйста в чем моя ошибка? Благодарность


person Mohammadreza    schedule 23.07.2020    source источник
comment
Можете ли вы показать нам ограничения? Bindig не должен вызывать предупреждение о нарушении ограничений.   -  person Dris    schedule 23.07.2020
comment
@Dris, конечно, добавление рассматриваемых ограничений, спасибо   -  person Mohammadreza    schedule 23.07.2020


Ответы (1)


В viewDidLoad viewController.view.frame == .zero, если вы вызываете bind(to) источник данных для tableView, вызовет layoutIfNeeds. В настоящее время ограничение автоматической компоновки не будет работать правильно (из-за того, что кадр = .zero). Чтобы избежать этого, вы можете использовать DispatchQueue.main.async для задержки вызова bind(to:), чтобы подавить предупреждение.

DispatchQueue.main.async {
    friends.compactMap{$0}.asObservable().bind(to: tableView.rx.items(cellIdentifier: WalletTableViewCell.reuseIdentifier,
                                                                      cellType: FriendWalletTableViewCell.self))
    { (row,item,cell) in
        
    cell.wallet = item
                                                                        
    }.disposed(by: disposeBag)
}
person Sua Le    schedule 01.10.2020