Sample/MVC/TicTacToe/Sources/ScoreSheet/ScoreSheetViewController.swift (80 lines of code) (raw):
//
// Copyright (c) 2018. Uber Technologies
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import RxCocoa
import RxSwift
import SnapKit
import UIKit
protocol ScoreSheetListener {
func done()
}
class ScoreSheetViewController: UIViewController {
public var listener: ScoreSheetListener?
init(scoreStream: ScoreStream) {
self.scoreStream = scoreStream
super.init(nibName: nil, bundle: nil)
}
required init?(coder _: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .blue
buildScoreSheet()
setupScoreStream()
}
// MARK: - Private
private let disposeBag = DisposeBag()
private let scoreStream: ScoreStream
private var player1Score: UILabel?
private var player2Score: UILabel?
private var okButton: UIButton?
private func buildScoreSheet() {
let player1Score = UILabel()
self.player1Score = player1Score
player1Score.backgroundColor = .lightGray
view.addSubview(player1Score)
player1Score.snp.makeConstraints { (maker: ConstraintMaker) in
maker.height.equalTo(44)
maker.top.equalTo(view).offset(100)
maker.leading.equalTo(view).offset(50)
maker.trailing.equalTo(view).offset(-50)
}
let player2Score = UILabel()
self.player2Score = player2Score
player2Score.backgroundColor = .lightGray
view.addSubview(player2Score)
player2Score.snp.makeConstraints { (maker: ConstraintMaker) in
maker.height.equalTo(player1Score)
maker.top.equalTo(player1Score.snp.bottom).offset(20)
maker.leading.trailing.equalTo(player1Score)
}
let okButton = UIButton()
self.okButton = okButton
okButton.backgroundColor = .black
view.addSubview(okButton)
okButton.snp.makeConstraints { (maker: ConstraintMaker) in
maker.height.equalTo(44)
maker.width.equalTo(100)
maker.bottom.equalTo(view).offset(-50)
maker.centerX.equalTo(view)
}
okButton.setTitle("OK", for: .normal)
okButton.setTitleColor(.white, for: .normal)
okButton.addTarget(self, action: #selector(didTapOkButton), for: .touchUpInside)
}
private func setupScoreStream() {
guard let player1Score = player1Score, let player2Score = player2Score else { return }
let initial = (PlayerScore(name: "None", score: 0), PlayerScore(name: "None", score: 0))
scoreStream.scores
.startWith(initial)
.map { score1, _ in "\(score1.name) : \(score1.score)" }
.bind(to: player1Score.rx.text)
.disposed(by: disposeBag)
scoreStream.scores
.startWith(initial)
.map { _, score2 in "\(score2.name) : \(score2.score)" }
.bind(to: player2Score.rx.text)
.disposed(by: disposeBag)
}
@objc
private func didTapOkButton() {
listener?.done()
}
}