Skip to content

Commit

Permalink
Merge pull request #10 from badoo/remove_text_kvo_observation
Browse files Browse the repository at this point in the history
Remove text kvo observation
  • Loading branch information
Ssimboss authored Jan 6, 2022
2 parents 1ec7c1c + 799344b commit ae22da0
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 30 deletions.
16 changes: 16 additions & 0 deletions HyperLabel/HLHyperLabel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,20 @@ public final class HLHyperLabel: UILabel, HyperLabelProtocol {
super.init(coder: aDecoder)
self.initializeHyperLabel()
}

var onTextDidChange: (StringChange) -> Void = { _ in }

public override var text: String? {
didSet {
self.onTextDidChange(StringChange(newValue: self.text, oldValue: oldValue))
}
}

var onAttributedTextChange: (AttributedStringChange) -> Void = { _ in }

public override var attributedText: NSAttributedString? {
didSet {
self.onAttributedTextChange(AttributedStringChange(newValue: self.attributedText, oldValue: oldValue))
}
}
}
43 changes: 21 additions & 22 deletions HyperLabel/HyperLabelPresenter.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@

import UIKit

public final class HyperLabelPresenter<TextView: UIView> where TextView: TextContainerData {
final class HyperLabelPresenter<TextView: UIView> where TextView: TextContainerData {

// MARK: - Type declarations

Expand All @@ -38,7 +38,7 @@ public final class HyperLabelPresenter<TextView: UIView> where TextView: TextCon
}
}

public typealias Handler = () -> Void
typealias Handler = () -> Void

// MARK: - Private properties

Expand All @@ -50,26 +50,26 @@ public final class HyperLabelPresenter<TextView: UIView> where TextView: TextCon

// MARK: - Instantiation

public init() {}
init() {}

// MARK: - Public API
// MARK: - API

public var extendsLinkTouchArea: Bool = true
var extendsLinkTouchArea: Bool = true

public weak var textView: TextView? {
weak var textView: TextView? {
didSet {
self.observerTextViewChanges()
}
}

public var additionalLinkAttributes: [NSAttributedString.Key: Any] {
var additionalLinkAttributes: [NSAttributedString.Key: Any] {
get { return self.textStyler.linkAttributes }
set { self.textStyler.linkAttributes = newValue }
}

public func addLink(addLinkWithRange range: NSRange,
accessibilityIdentifier: String?,
withHandler handler: @escaping Handler) {
func addLink(addLinkWithRange range: NSRange,
accessibilityIdentifier: String?,
withHandler handler: @escaping Handler) {
guard let textView = self.textView else {
assertionFailure("textView is nil")
return
Expand All @@ -87,7 +87,7 @@ public final class HyperLabelPresenter<TextView: UIView> where TextView: TextCon
}

@objc
public func handleTapGesture(sender: UITapGestureRecognizer) {
func handleTapGesture(sender: UITapGestureRecognizer) {
guard sender.state == .ended else { return }
guard let view = self.textView else {
assertionFailure("textView is nil")
Expand All @@ -111,25 +111,24 @@ public final class HyperLabelPresenter<TextView: UIView> where TextView: TextCon
private func didChangeText() {
guard self.shouldReactToTextChange else { return }
self.linkRegistry.clear()
self.reloadAccessibilityElements()
}

private var textViewObservers: [NSKeyValueObservation] = []
private func observerTextViewChanges() {
guard let textView = self.textView else {
guard var textView = self.textView else {
self.textViewObservers.removeAll()
return
}
textView.onTextDidChange = { [weak self] change in
guard let self = self, change.oldValue != change.newValue else { return }
self.didChangeText()
}
textView.onAttributedTextChange = { [weak self] change in
guard let self = self, change.oldValue != change.newValue else { return }
self.didChangeText()
}
self.textViewObservers = [
textView.observe(\.text, options: [.new, .old]) { [weak self] _, change in
guard let self = self, change.oldValue != change.newValue else { return }
self.didChangeText()
self.reloadAccessibilityElements()
},
textView.observe(\.attributedText, options: [.new, .old]) { [weak self] _, change in
guard let self = self, change.oldValue != change.newValue else { return }
self.didChangeText()
self.reloadAccessibilityElements()
},
textView.observe(\.bounds, options: [.new, .old, .initial]) { [weak self] _, change in
guard let self = self, change.oldValue != change.newValue else { return }
self.reloadAccessibilityElements()
Expand Down
4 changes: 2 additions & 2 deletions HyperLabel/HyperLabelProtocol.swift
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ extension HyperLabelProtocol {

private var presenterAssociatedKey = 0

extension HyperLabelProtocol where Self: UILabel {
extension HyperLabelProtocol where Self: HLHyperLabel {

private typealias Presenter = HyperLabelPresenter<Self>

Expand Down Expand Up @@ -109,7 +109,7 @@ extension HyperLabelProtocol where Self: UILabel {
}
}

private extension UILabel {
private extension HLHyperLabel {
func setupForHyperLabel() {
self.isAccessibilityElement = false
self.isUserInteractionEnabled = true
Expand Down
21 changes: 15 additions & 6 deletions HyperLabel/TextContainerData.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,27 @@

import UIKit

@objc
public protocol TextContainerData {
struct Change<T> {
let newValue: T
let oldValue: T
}

typealias StringChange = Change<String?>
typealias AttributedStringChange = Change<NSAttributedString?>

protocol TextContainerData {
var font: UIFont! { get }
@objc var text: String? { get }
@objc var attributedText: NSAttributedString? { get set }
var text: String? { get }
var attributedText: NSAttributedString? { get set }
var lineBreakMode: NSLineBreakMode { get }
var numberOfLines: Int { get }
var size: CGSize { get }
var onTextDidChange: (StringChange) -> Void { get set }
var onAttributedTextChange: (AttributedStringChange) -> Void { get set }
}

extension UILabel: TextContainerData {
public var size: CGSize {
extension HLHyperLabel: TextContainerData {
var size: CGSize {
return self.bounds.size
}
}

0 comments on commit ae22da0

Please sign in to comment.