【问题标题】:Why isn't my rx tableview instantly responsive?为什么我的 rx tableview 没有立即响应?
【发布时间】:2021-02-17 12:47:41
【问题描述】:

我使用rx swift 创建了一个tableView,它可以正常工作,除了一件事:如果我在输入view 时按下cell,则不会发生任何事情。我在.modeSelected 中添加了一个打印件,但它没有注册。如果我等待大约半秒到一秒,然后再按一次,它工作正常。这使用户体验感觉就像您必须双击才能使操作生效。

@IBOutlet weak var tableView: UITableView! {
    didSet {
        tableView.rx.modelSelected(SettingsTableViewCellViewModel.self).subscribe(onNext: { [weak self] cellViewModel in
            print("THIS TRIGGERS ONLY IF YOU CLICK AFTER 0.5-1 SEC")
            //STUFF HAPPENS
        }).disposed(by: disposeBag)
    }

由于modeSelectedtableViewdidSet 内,我知道tableView 已经完成了它的工作并且所有数据都可用。我尝试将tableView.delaysContentTouches 设置为false,并确保将tableView.isUserInteractionEnabled 设置为true

这是接受内容的方式:

func reloadContent() {
    let allContent = [SettingsTableViewCellViewModel(title: "active_errors".localized(),
                                                     segue: "ErrorsSegue",
                                                     shouldBeShown: { return DoorConnectionStatus.connected == self.statusRelay?.value.status }),
                      SettingsTableViewCellViewModel(title: "events".localized(),
                                                     segue: "EventStatusSegue",
                                                     shouldBeShown: { return DoorConnectionStatus.connected == self.statusRelay?.value.status }),
                      SettingsTableViewCellViewModel(title: "event_log".localized(),
                                                     segue: "EventLogSegue",
                                                     shouldBeShown: { return DoorConnectionStatus.connected == self.statusRelay?.value.status }),
                          
                      //...and it keeps going
    ]
    content.accept(allContent.filter { $0.shouldBeShown() == true })
}

然后绑定到tableView

viewModel.content.bind(to: tableView.rx.items(cellIdentifier: SettingsTableViewCell.identifier, cellType: SettingsTableViewCell.self)) { _, data, cell in
    cell.viewModel = data
}.disposed(by: disposeBag)

【问题讨论】:

  • 这种情况是每次都发生,还是仅在您启动应用程序后第一次发生?是仅在您使用模拟器时还是在设备上时才使用?
  • @DanielT。是的,每次我退出视图并重新进入时,我都会遇到问题。如果我等待一秒钟,那么没有问题。这也是一致的。我只在设备上运行它,因为该应用无法在模拟器上运行。
  • 我只是设置了一个示例应用程序,其中包含您在上面编写的所有代码。我没有遇到你说的问题。您的问题不是此代码,而是其他地方。尝试编写一个最小的可编译示例,以解决您遇到的问题并更新您的问题。您可能会在制作样品时发现问题。
  • @DanielT 感谢您的测试。我会按照您的建议尝试,如果找到任何东西,我会回来。

标签: ios swift tableview rx-swift


【解决方案1】:

嗯,您为什么要在 tableView 属性上使用 didSet 来执行此操作? 为什么不使用viewDidLoad? 比如:

@IBOutlet weak var tableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.rx.modelSelected(SettingsTableViewCellViewModel.self)
      .subscribe(onNext: { [weak self] cellViewModel in })
    
}

【讨论】:

  • 在单击单元格之前确保 tableView 设置正确。当然,你也可以把它放在 viewDidLoad 中。无论如何,它并没有以任何方式解决手头的问题。
  • 你试过了吗?你有同样的行为吗?
  • 是的,我试过了,但问题仍然存在。不过谢谢:)
  • 那么问题出在其他地方。请展示如何将SettingsTableViewCellViewModel 的数组绑定到tableView
【解决方案2】:

好的,经过一番调查,发现这个问题仅仅是由于viewController 过渡动画没有完成。看起来它已经完成了,但如果我仔细观察,我会发现它还没有完成。似乎动画到最后会变慢一点,所以当我点击tableView 时,动画仍在进行中,所以cells 无法点击。当我关闭动画时,这一点变得很明显。现在所有cells 都可以立即点击。

问题可以通过关闭动画或设置来解决 self.window?.layer.speed = 2.0 或其他(虽然这是全球性的)。参考:How do I speed up iOS transitions and segues?

【讨论】:

    猜你喜欢
    • 2011-04-20
    • 2017-05-24
    • 1970-01-01
    • 2012-01-09
    • 2015-01-13
    • 1970-01-01
    • 2015-12-30
    • 2014-04-28
    • 1970-01-01
    相关资源
    最近更新 更多