我需要绑定slider.rx.value到具有不同映射的2个观察者。
slider.rx.value.map { [unowned self] in self.formatter.string(from: NSNumber(value: $0)) ?? "" }
.bindTo(textFieldAlpha.rx.text)
.addDisposableTo(disposeBag)
slider.rx.value.map { Enhance.Global(alpha: $0) }
.bindTo(enhance)
.addDisposableTo(disposeBag)
Run Code Online (Sandbox Code Playgroud)
但我似乎只有最后一次绑定有效。如何实现呢?
我已经在Ray Wenderlich的教程之后在我的Cocoa应用程序上实现了一个集合视图(非常有用,考虑到这个领域中有多少错误和破坏了Apple的API).
在本教程中,使用以下代码将集合视图的画布涂成黑色(所有代码都在视图控制器类的viewDidLoad()方法中):
collectionView.layer?.backgroundColor = NSColor.black.cgColor
Run Code Online (Sandbox Code Playgroud)
然而,当您使用 - 例如 - 魔术鼠标/滚轮来超过("橡皮筋")滚动时"窥视"的区域仍然是白色且非常分散注意力:
我试图让整个内容区域变黑.在我的故事板,我同时设置的背景颜色NSScrollView和NSClipView包含集合视图为黑色,但它不会改变外观.还尝试了程序化的替代方案:为scrollview设置插座并调用:
self.scrollview.backgroundColor = NSColor.black
self.scrollview.contentView.backgroundColor = NSColor.black
Run Code Online (Sandbox Code Playgroud)
......没有效果.
另外,我尝试过:
collectionView.superview?.layer?.backgroundColor = NSColor.black.cgColor
Run Code Online (Sandbox Code Playgroud)
......但这也不起作用.
也不是:
self.view.layer?.backgroundColor = NSColor.black.cgColor
Run Code Online (Sandbox Code Playgroud)
要么:
self.view.window?.backgroundColor = NSColor.black
Run Code Online (Sandbox Code Playgroud)
更新:
我已将滚动视图的背景颜色设置为红色,并设置drawsBackground为true(以IB和编程方式).对于文档NSScrollView的backgroundColor属性说:
此颜色用于绘制内容视图中文档视图未覆盖的区域.
我在运行时验证了文档视图确实是我的集合视图:
if scrollview.documentView is NSCollectionView {
print("Document is collection")
}
Run Code Online (Sandbox Code Playgroud)
但是,不显示红色,文档(集合视图)之外的区域保持白色.
更新2:我解雇了View Hierarchy Debugger,似乎drawsBackground运行时的值为false(我true在代码和故事板中都设置了它)!:
(虽然背景颜色本身似乎有所反映)
我见过很多关于油门和去抖的博客.大多数人都说他们是一回事.但是我从我的例子中得到了不同的结果?这是一个例子:
let disposeBag = DisposeBag()
Observable.of(1,2,3,4,5)
.debounce(1, scheduler: MainScheduler.instance)
.subscribe(onNext: {print($0)})
.addDisposableTo(disposeBag)
Run Code Online (Sandbox Code Playgroud)
结果是5.但是当我使用油门时,结果是1
let disposeBag = DisposeBag()
Observable.of(1,2,3,4,5)
.throttle(1, scheduler: MainScheduler.instance)
.subscribe(onNext: {print($0)})
.addDisposableTo(disposeBag)
Run Code Online (Sandbox Code Playgroud)
那么,我无法理解油门操作员?
假设我有一个带有值的CustomView.我想使用rx.value(Observable)将该值公开给世界,而不是必须通过值(Int)访问它.
final class CustomView: UIView {
var value: Int = 0
...
}
Run Code Online (Sandbox Code Playgroud)
我从UIStepper + Rx复制了这个:
extension Reactive where Base: CustomView {
var value: ControlProperty<Int> {
return base.rx.controlProperty(editingEvents: [.allEditingEvents, .valueChanged],
getter: { customView in
customView.currentValue
}, setter: { customView, value in
customView.currentValue = value
}
)
}
}
final class CustomView: UIControl {
fileprivate var currentValue = 1 {
didSet {
checkButtonState()
valueLabel.text = currentValue.description
}
}
// inside i set currentValue = 3
}
Run Code Online (Sandbox Code Playgroud)
但customView.rx.value不会发出任何值
这是 RxSwift 中的 tableView 我无法配置数据源。RxTableViewSectionedReloadDataSource 似乎缺少参数,尽管这很奇怪,因为我遵循官方文档的完全相同的代码源
Xcode 错误 每当我按回车键自动完成关闭。关闭保持空白。
自动完成无效 我真的不知道如何解决这个问题
let dataSource = RxTableViewSectionedReloadDataSource<SectionModel>()
dataSource?.configureCell = { (ds: RxTableViewSectionedReloadDataSource<SectionOfCustomData>, tv: UITableView, ip: IndexPath, item: Article) -> NewsFeedCell in
let cell = tv.dequeueReusableCell(withIdentifier: "Cell", for: ip) as! NewsFeedCell
cell.configure(news: item)
return cell
}
dataSource?.titleForHeaderInSection = { ds, index in
return ds.sectionModels[index].header
}
let sections = [
SectionOfCustomData(header: "First section", items: self.articles),
SectionOfCustomData(header: "Second section", items: self.articles)
]
guard let dtSource = dataSource else {
return
}
Observable.just(sections)
.bind(to: …Run Code Online (Sandbox Code Playgroud) 将Objective-C for-loop转换为Swift 3的最好和最干净的方法是什么?什么是最佳做法?我应该使用while循环吗?
NSInteger pageHeight = 792;
NSInteger pageWidth = 612;
for (int page=0; pageHeight * page < scrollView.frame.size.height; page++) {
// execute some code
}
Run Code Online (Sandbox Code Playgroud)
我尝试过这样的事情
for i in pageHeight * i < scrollView.frame.size.height {
// execute some code
}
Run Code Online (Sandbox Code Playgroud)
但我无法重复使用变量i,因为它无法使用.编译器给出错误:未解析的标识符'i'.
编辑:我问这个问题的原因之一是因为我想明确知道最佳实践是什么,并避免在循环代码之前创建一个额外的变量.
我使用RxSwift实现UITableView时遇到问题.
我尝试使用以下代码将一个模型数组的observable绑定到表项.
models.bind(to: self.tableView.rx.items(cellIdentifier: "Cell", cellType: ModelTableViewCell.self.
但是当我这样做时,它给了我以下错误:Type 'inout UITableView' does not conform to protocol 'ReactiveCompatible'我知道错误是不对的,因为NSObject扩展了ReactiveCompatible,所以UITableView也可以.另外,我的项目代码与RxSwiftCommunity上显示的示例并没有太大的不同
我创建了一个有错误的小示例项目.
我正在使用 RxSwift
pod 'RxSwift', '~> 4.0'
pod 'RxCocoa', '~> 4.0'
Run Code Online (Sandbox Code Playgroud)
我看到了用户名、密码验证的例子,因为它的工作原理是
func validateUsername(_ username: String) -> Observable<ValidationResult> {
if username.isEmpty {
return .just(.empty)
}
// this obviously won't be
if username.rangeOfCharacter(from: CharacterSet.alphanumerics.inverted) != nil {
return .just(.failed(message: "Username can only contain numbers or digits"))
}
// this obviously won't be
if username.rangeOfCharacter(from: CharacterSet.alphanumerics.inverted) != nil {
return .just(.failed(message: "Username can only contain numbers or digits"))
}
let loadingValue = ValidationResult.validating
return API
.usernameAvailable(username)
.map { available in
if available { …Run Code Online (Sandbox Code Playgroud) swift ×7
rx-swift ×6
ios ×4
appkit ×1
cocoa ×1
for-loop ×1
macos ×1
objective-c ×1
rx-cocoa ×1
uitableview ×1
validation ×1