gpt4 book ai didi

ios - UINavigationBar 的 UIBindingObserver 无法按预期工作

转载 作者:行者123 更新时间:2023-11-30 12:11:02 25 4
gpt4 key购买 nike

我为 barTintColor 新的 UIColortitle 绑定(bind)到 UIBindingObserver,但它没有显示。有线的事情是,当我将 UIViewController 拖回来并释放时,所有内容都会出现

<小时/>

代码

extension Reactive where Base: UINavigationBar {
var barTintColor: UIBindingObserver<Base, UIColor> {
return UIBindingObserver(UIElement: self.base) { navigationBar, barTintColor in
navigationBar.barTintColor = barTintColor
}
}
}

class BaseViewController: UIViewController {
private(set) var tintColor: Variable<UIColor> = Variable(ColorConstants.tintColor)

override func viewDidLoad() {
super.viewDidLoad()
if let navigationBar = self.navigationController?.navigationBar {
self.tintColor.asObservable()
.bind(to: navigationBar.rx.barTintColor)
.addDisposableTo(self.disposeBag)
}
}
}

class TasksListViewController: BaseViewController {
var viewModel: TasksListViewModel!
...
override func viewDidLoad() {
super.viewDidLoad()
self.viewModel.colorObsrvable
.unwrap()
.bind(to: self.tintColor)
.addDisposableTo(self.disposeBag)

self.viewModel.titleObsrvable
.unwrap()
.bind(to: self.rx.title)
.addDisposableTo(self.disposeBag)
}
}

class TasksListViewModel {
private(set) var titleObsrvable: Observable<String?>!
private(set) var colorObsrvable: Observable<UIColor?>!

init(from goal: Goal) {
let goalPredicate = NSPredicate(format: "(SELF = %@)", self.goal.objectID)
self.goalObservable = CoreDataModel.shared.rx.fetchObject(predicate: goalPredicate)
self.titleObsrvable = goalObservable.map { $0?.name }
self.colorObsrvable = goalObservable.map { $0?.color }
}
}

extension Reactive where Base: CoreDataModel {
func fetchObjects<T: NSManagedObject>(predicate: NSPredicate? = nil) -> Observable<[T]> {
let entityName = String(describing: T.self)
let fetchRequest = NSFetchRequest<T>(entityName: entityName)
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
fetchRequest.predicate = predicate
return base.managedObjectContext.rx.entities(fetchRequest: fetchRequest)
}
}

目标只是类实体

<小时/>

我尝试过的

  • 是的,我测试过,它是主线程。并且也在 GCD MainThread 上运行这个任务❌
  • 添加的observeOn(MainScheduler.sharedInstance)没有帮助❌
  • 在 UIBindingObserver 内部放置断点,当拖动并释放时它不会调用❌
  • 将 Storyboard中的标题添加到导航栏并且它可以工作,但有有线延迟。首先它显示“Ti...”,然后显示“Title”✅

已替换(及其有效✅ 不知道为什么):

self.titleObsrvable = goalObservable.map { $0?.name }
self.colorObsrvable = goalObservable.map { $0?.color }

与:

self.titleObsrvable = Observable.of("1234")
self.colorObsrvable = Observable.of(UIColor.red)

知道我做错了什么吗?

<小时/>

如果您想检查整个项目,您可以在这里查看: https://github.com/Yerkenabildin/my-everest

<小时/>

最佳答案

这似乎是某种竞争条件。您在导航 Controller 开始其动画的同时设置 barTintColor。如果您确保在动画完成之后之前不更改锡颜色,它将按照您想要的方式工作。

此外,您对同一导航栏的 rx.barTintColor 有两个不同的绑定(bind)器,并且它们向栏提供冲突的信息。如果可能的话,您应该只拥有一个 Binder 。

关于ios - UINavigationBar 的 UIBindingObserver 无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46058266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com