Skip to content

Commit

Permalink
Some improvements and new playgorunds
Browse files Browse the repository at this point in the history
  • Loading branch information
srdanrasic committed Oct 7, 2018
1 parent c572f73 commit 6b75ec0
Show file tree
Hide file tree
Showing 17 changed files with 238 additions and 137 deletions.
32 changes: 16 additions & 16 deletions Bond.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@
90C04D091E8F0AD5000077C8 /* Bond.h in Headers */ = {isa = PBXBuildFile; fileRef = 90C04D031E8F0A97000077C8 /* Bond.h */; settings = {ATTRIBUTES = (Public, ); }; };
90C04D0A1E8F0AD5000077C8 /* Bond.h in Headers */ = {isa = PBXBuildFile; fileRef = 90C04D031E8F0A97000077C8 /* Bond.h */; settings = {ATTRIBUTES = (Public, ); }; };
90C04D5A1E8F0B88000077C8 /* Bond.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90C04D201E8F0B1D000077C8 /* Bond.swift */; };
90C04D5B1E8F0B88000077C8 /* SectionedDataSourceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90C04D221E8F0B1D000077C8 /* SectionedDataSourceProtocol.swift */; };
90C04D5B1E8F0B88000077C8 /* SectionedDataSourceChangesetConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90C04D221E8F0B1D000077C8 /* SectionedDataSourceChangesetConvertible.swift */; };
90C04D5C1E8F0B88000077C8 /* DynamicSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90C04D231E8F0B1D000077C8 /* DynamicSubject.swift */; };
90C04D5D1E8F0B88000077C8 /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90C04D371E8F0B1D000077C8 /* Observable.swift */; };
90C04D5E1E8F0B88000077C8 /* ProtocolProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90C04D3C1E8F0B1D000077C8 /* ProtocolProxy.swift */; };
Expand All @@ -96,7 +96,7 @@
90C04D631E8F0B88000077C8 /* NSObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90C04D2D1E8F0B1D000077C8 /* NSObject.swift */; };
90C04D641E8F0B88000077C8 /* SignalProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90C04D3E1E8F0B1D000077C8 /* SignalProtocol.swift */; };
90C04D651E8F0B89000077C8 /* Bond.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90C04D201E8F0B1D000077C8 /* Bond.swift */; };
90C04D661E8F0B89000077C8 /* SectionedDataSourceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90C04D221E8F0B1D000077C8 /* SectionedDataSourceProtocol.swift */; };
90C04D661E8F0B89000077C8 /* SectionedDataSourceChangesetConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90C04D221E8F0B1D000077C8 /* SectionedDataSourceChangesetConvertible.swift */; };
90C04D671E8F0B89000077C8 /* DynamicSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90C04D231E8F0B1D000077C8 /* DynamicSubject.swift */; };
90C04D681E8F0B89000077C8 /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90C04D371E8F0B1D000077C8 /* Observable.swift */; };
90C04D691E8F0B89000077C8 /* ProtocolProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90C04D3C1E8F0B1D000077C8 /* ProtocolProxy.swift */; };
Expand Down Expand Up @@ -268,7 +268,7 @@
ECBCE0DE2161713A0078E03B /* Property+ChangesetContainerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC5EB155215D721600338531 /* Property+ChangesetContainerProtocol.swift */; };
ECBCE0E0216172E10078E03B /* Signal+ChangesetProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECC4357621610C040002A869 /* Signal+ChangesetProtocol.swift */; };
ECBCE0E3216173160078E03B /* OrderedCollectionDiff+Strideable+Differ.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECC43578216114B80002A869 /* OrderedCollectionDiff+Strideable+Differ.swift */; };
ECBCE0E62161766C0078E03B /* SectionedDataSourceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90C04D221E8F0B1D000077C8 /* SectionedDataSourceProtocol.swift */; };
ECBCE0E62161766C0078E03B /* SectionedDataSourceChangesetConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90C04D221E8F0B1D000077C8 /* SectionedDataSourceChangesetConvertible.swift */; };
ECBCE0E8216179BC0078E03B /* UITableViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90C04DD11E8F0BA7000077C8 /* UITableViewTests.swift */; };
ECC1A6D0207A18DC00AE762C /* NSTableView+ObservableCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECC1A6CF207A18DC00AE762C /* NSTableView+ObservableCollection.swift */; };
ECC1A6D1207A18DC00AE762C /* NSTableView+ObservableCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECC1A6CF207A18DC00AE762C /* NSTableView+ObservableCollection.swift */; };
Expand All @@ -292,9 +292,9 @@
ECFF44B72168F5C000B5EDB0 /* Instantiatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFF44B62168F5C000B5EDB0 /* Instantiatable.swift */; };
ECFF44B82168F5C000B5EDB0 /* Instantiatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFF44B62168F5C000B5EDB0 /* Instantiatable.swift */; };
ECFF44B92168F5C000B5EDB0 /* Instantiatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFF44B62168F5C000B5EDB0 /* Instantiatable.swift */; };
ECFF44BC21692B5800B5EDB0 /* TreeArrayDataSourceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFF44BB21692B5800B5EDB0 /* TreeArrayDataSourceProtocol.swift */; };
ECFF44BD21692B5800B5EDB0 /* TreeArrayDataSourceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFF44BB21692B5800B5EDB0 /* TreeArrayDataSourceProtocol.swift */; };
ECFF44BE21692B5800B5EDB0 /* TreeArrayDataSourceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFF44BB21692B5800B5EDB0 /* TreeArrayDataSourceProtocol.swift */; };
ECFF44BC21692B5800B5EDB0 /* OutlineChangesetConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFF44BB21692B5800B5EDB0 /* OutlineChangesetConvertible.swift */; };
ECFF44BD21692B5800B5EDB0 /* OutlineChangesetConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFF44BB21692B5800B5EDB0 /* OutlineChangesetConvertible.swift */; };
ECFF44BE21692B5800B5EDB0 /* OutlineChangesetConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFF44BB21692B5800B5EDB0 /* OutlineChangesetConvertible.swift */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
Expand Down Expand Up @@ -401,7 +401,7 @@
90C04D181E8F0B12000077C8 /* BNDProtocolProxyBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BNDProtocolProxyBase.h; sourceTree = "<group>"; };
90C04D201E8F0B1D000077C8 /* Bond.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Bond.swift; sourceTree = "<group>"; };
90C04D211E8F0B1D000077C8 /* CALayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CALayer.swift; sourceTree = "<group>"; };
90C04D221E8F0B1D000077C8 /* SectionedDataSourceProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SectionedDataSourceProtocol.swift; sourceTree = "<group>"; };
90C04D221E8F0B1D000077C8 /* SectionedDataSourceChangesetConvertible.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SectionedDataSourceChangesetConvertible.swift; sourceTree = "<group>"; };
90C04D231E8F0B1D000077C8 /* DynamicSubject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DynamicSubject.swift; sourceTree = "<group>"; };
90C04D241E8F0B1D000077C8 /* NotificationCenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationCenter.swift; sourceTree = "<group>"; };
90C04D251E8F0B1D000077C8 /* NSAppearanceCustomization.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSAppearanceCustomization.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -493,7 +493,7 @@
ECFF44AC2168C12300B5EDB0 /* IndexPath+Bond.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "IndexPath+Bond.swift"; sourceTree = "<group>"; };
ECFF44B02168C21F00B5EDB0 /* Array2D.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Array2D.swift; sourceTree = "<group>"; };
ECFF44B62168F5C000B5EDB0 /* Instantiatable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Instantiatable.swift; sourceTree = "<group>"; };
ECFF44BB21692B5800B5EDB0 /* TreeArrayDataSourceProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TreeArrayDataSourceProtocol.swift; sourceTree = "<group>"; };
ECFF44BB21692B5800B5EDB0 /* OutlineChangesetConvertible.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OutlineChangesetConvertible.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
Expand Down Expand Up @@ -813,8 +813,8 @@
ECFF44BA21691F9E00B5EDB0 /* Data Sources */ = {
isa = PBXGroup;
children = (
90C04D221E8F0B1D000077C8 /* SectionedDataSourceProtocol.swift */,
ECFF44BB21692B5800B5EDB0 /* TreeArrayDataSourceProtocol.swift */,
90C04D221E8F0B1D000077C8 /* SectionedDataSourceChangesetConvertible.swift */,
ECFF44BB21692B5800B5EDB0 /* OutlineChangesetConvertible.swift */,
);
path = "Data Sources";
sourceTree = "<group>";
Expand Down Expand Up @@ -1102,7 +1102,7 @@
90C04DC01E8F0B97000077C8 /* UISwitch.swift in Sources */,
EC1F12712167BFB4002F0D1B /* UnorderedCollectionDiff.swift in Sources */,
90C04D731E8F0B89000077C8 /* Observable.swift in Sources */,
ECFF44BC21692B5800B5EDB0 /* TreeArrayDataSourceProtocol.swift in Sources */,
ECFF44BC21692B5800B5EDB0 /* OutlineChangesetConvertible.swift in Sources */,
ECBCE0C2216168250078E03B /* OrderedCollectionDiff.swift in Sources */,
90A443101E9055D100D611FE /* NSStatusBarButton.swift in Sources */,
90C04D741E8F0B89000077C8 /* ProtocolProxy.swift in Sources */,
Expand Down Expand Up @@ -1137,7 +1137,7 @@
070FE2741F0138180031B7BD /* NSLayoutConstraint.swift in Sources */,
EC1F127D2167C9EE002F0D1B /* UnorderedCollectionChangeset+Set.swift in Sources */,
90C04DB61E8F0B97000077C8 /* UIGestureRecognizer.swift in Sources */,
ECBCE0E62161766C0078E03B /* SectionedDataSourceProtocol.swift in Sources */,
ECBCE0E62161766C0078E03B /* SectionedDataSourceChangesetConvertible.swift in Sources */,
90A4430B1E9055D100D611FE /* NSMenuItem.swift in Sources */,
90C04DB01E8F0B97000077C8 /* UIBarButtonItem.swift in Sources */,
90A443091E9055D100D611FE /* NSControl.swift in Sources */,
Expand Down Expand Up @@ -1251,9 +1251,9 @@
90A443381E9055D800D611FE /* UITextField.swift in Sources */,
90C04D881E8F0B8D000077C8 /* NSTextField.swift in Sources */,
90A4432A1E9055D800D611FE /* UIControl.swift in Sources */,
ECFF44BD21692B5800B5EDB0 /* TreeArrayDataSourceProtocol.swift in Sources */,
ECFF44BD21692B5800B5EDB0 /* OutlineChangesetConvertible.swift in Sources */,
EC1F127A2167C0B7002F0D1B /* UnorderedCollectionOperation.swift in Sources */,
90C04D661E8F0B89000077C8 /* SectionedDataSourceProtocol.swift in Sources */,
90C04D661E8F0B89000077C8 /* SectionedDataSourceChangesetConvertible.swift in Sources */,
90C04D651E8F0B89000077C8 /* Bond.swift in Sources */,
90C04D6F1E8F0B89000077C8 /* SignalProtocol.swift in Sources */,
EC381184209EFFA600613B29 /* NSOutlineView.swift in Sources */,
Expand Down Expand Up @@ -1342,9 +1342,9 @@
9025DCB01F981694007B7689 /* Property.swift in Sources */,
90C04DA71E8F0B96000077C8 /* UISlider.swift in Sources */,
90C04DA51E8F0B96000077C8 /* UIRefreshControl.swift in Sources */,
90C04D5B1E8F0B88000077C8 /* SectionedDataSourceProtocol.swift in Sources */,
90C04D5B1E8F0B88000077C8 /* SectionedDataSourceChangesetConvertible.swift in Sources */,
90C04DA61E8F0B96000077C8 /* UISegmentedControl.swift in Sources */,
ECFF44BE21692B5800B5EDB0 /* TreeArrayDataSourceProtocol.swift in Sources */,
ECFF44BE21692B5800B5EDB0 /* OutlineChangesetConvertible.swift in Sources */,
EC1F127B2167C0B7002F0D1B /* UnorderedCollectionOperation.swift in Sources */,
90A443161E9055D200D611FE /* NSButton.swift in Sources */,
90C04D5A1E8F0B88000077C8 /* Bond.swift in Sources */,
Expand Down
8 changes: 4 additions & 4 deletions Package.resolved
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,17 @@
"repositoryURL": "https://github.com/tonyarnold/Differ.git",
"state": {
"branch": null,
"revision": "c0e4b222b5ae3c97a6087cc9b6a9adc01108635b",
"version": "1.2.0"
"revision": "2547774f17f637a5c233ee575b678ff2efcabd1d",
"version": "1.3.0"
}
},
{
"package": "ReactiveKit",
"repositoryURL": "https://github.com/ReactiveKit/ReactiveKit.git",
"state": {
"branch": null,
"revision": "9a39d064df41a013ed5d76c2703e517a315d5665",
"version": "3.9.4"
"revision": "9963d9cfe5de7e7c1843f33aa5a192ac5b40837d",
"version": "3.9.6"
}
}
]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,24 @@ import Bond
import ReactiveKit
import PlaygroundSupport

class Test: NSObject {
dynamic var test: String! = "0"
class Contact: NSObject {
@objc dynamic var name: String? = "n/a"
}

var test: Test! = Test()
weak var weakTest: Test? = test
var contact: Contact! = Contact()
weak var weakTest: Contact? = contact

test.keyPath("test", ofType: Optional<String>.self).observe { event in
contact.reactive.keyPath(\.name).observeNext { event in
print(event)
}

test.test = "a"
test.test = nil
test.test = "g"
contact.name = "jim"
contact.name = nil
contact.name = "james"

Signal1.just("c").bind(to: test.keyPath("test", ofType: Optional<String>.self))
SafeSignal.just("j").bind(to: contact, keyPath: \.name, context: .immediate)

test = nil
weakTest
contact = nil
assert(weakTest == nil)

//: [Next](@next)
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ var t = TreeArray<String>([
TreeNode("Child 01")
])

let ot = MutableObservableTreeArray(t)
let ot = MutableObservableTree(t)

ot.observeNext { (cs) in
print(cs.collection, cs.diff, cs.patch)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
//: [Previous](@previous)

import Foundation
import PlaygroundSupport
import UIKit
import Bond
import ReactiveKit

let tableView = UITableView()
tableView.frame.size = CGSize(width: 300, height: 600)

// Note: Open the assistant editor to see the table view
PlaygroundPage.current.liveView = tableView
PlaygroundPage.current.needsIndefiniteExecution = true

// Using custom binder to provide table view header titles
class CustomBinder<Changeset: SectionedDataSourceChangeset>: TableViewBinderDataSource<Changeset> where Changeset.Collection == Array2D<String, Int> {

@objc func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return changeset?.collection[sectionAt: section]
}
}

// Array2D is generic over section metadata `Section` and item value `Item`.
// Section metadata is the data associated with the section, like section header titles.
// You can specialise `Section` to `Void` if there is no section metadata.
// Item values are values displayed by the table view cells.
let initialData = Array2D<String, Int>(sectionsWithItems: [
("A", [1, 2]),
("B", [10, 20])
])

let data = MutableObservableArray2D(initialData)

data.bind(to: tableView, cellType: UITableViewCell.self, using: CustomBinder()) { (cell, item) in
cell.textLabel?.text = "\(item)"
}

DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
data.appendItem(3, toSectionAt: 0)
}

DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
data.batchUpdate { (data) in
data.appendItem(4, toSectionAt: 0)
data.insert(section: "Aa", at: 1)
data.appendItem(100, toSectionAt: 1)
data.insert(item: 50, at: IndexPath(item: 0, section: 1))
}
}

DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
data.moveItem(from: IndexPath(item: 0, section: 1), to: IndexPath(item: 0, section: 0))
}

//: [Next](@next)
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
//: [Previous](@previous)

import Foundation
import PlaygroundSupport
import UIKit
import Bond
import ReactiveKit

let tableView = UITableView()
tableView.frame.size = CGSize(width: 300, height: 300)

// Note: Open the assistant editor to see the table view
PlaygroundPage.current.liveView = tableView
PlaygroundPage.current.needsIndefiniteExecution = true

// A signal that emits a value every 1 second
let pulse = SafeSignal<Int>.interval(1)

// A signal of [String]
let data = SafeSignal
.sequence([
["A"],
["A", "B", "C"],
["A", "C"],
["C", "A"]
])
.zip(with: pulse) { data, _ in data } // add 1 second delay between events
.diff() // diff each new array against the previous one

data.bind(to: tableView, cellType: UITableViewCell.self) { (cell, string) in
cell.textLabel?.text = string
}

//: [Next](@next)
4 changes: 3 additions & 1 deletion Playground-iOS.playground/contents.xcplayground
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
<playground version='6.0' target-platform='ios' display-mode='raw' executeOnSourceChanges='false'>
<pages>
<page name='Observable Collections'/>
<page name='UITableView Bindings'/>
<page name='UITableView+Signal+Diff'/>
<page name='UITableView+ObservableArray'/>
<page name='UITableView+ObservableArray2D'/>
<page name='Key Value Observing'/>
</pages>
</playground>
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ outlineView.frame.size = CGSize(width: 300, height: 300)
PlaygroundPage.current.liveView = outlineView
PlaygroundPage.current.needsIndefiniteExecution = true

let tree = TreeArray.Object([TreeNode("A"), TreeNode("B")])
let tree = ObjectTreeArray([TreeNode("A"), TreeNode("B")])

let data = MutableObservableObjectTreeArray(tree)
let data = MutableObservableTree(tree)

data.bind(to: outlineView, cellType: NSTextView.self) { (cell, node) in
cell.string = node.value
Expand Down
8 changes: 4 additions & 4 deletions Sources/Bond/AppKit/NSOutlineView+Changeset.swift
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ extension OutlineViewBinder {
}
}

extension SignalProtocol where Element: TreeArrayChangesetConvertible, Error == NoError {
extension SignalProtocol where Element: OutlineChangesetConvertible, Error == NoError {
/// Binds the signal of data source elements to the given outline view.
///
/// - parameters:
Expand Down Expand Up @@ -236,7 +236,7 @@ extension SignalProtocol where Element: TreeArrayChangesetConvertible, Error ==

}

extension SignalProtocol where Element: TreeArrayChangesetConvertible, Error == NoError {
extension SignalProtocol where Element: OutlineChangesetConvertible, Error == NoError {

/// Binds the signal of data source elements to the given outline view.
///
Expand All @@ -251,7 +251,7 @@ extension SignalProtocol where Element: TreeArrayChangesetConvertible, Error ==
public func bind<Cell: NSView>(to outlineView: NSOutlineView, cellType: Cell.Type, animated: Bool = true, rowAnimation: NSOutlineView.AnimationOptions = [.effectFade, .slideUp], configureCell: @escaping (Cell, Element.Changeset.Collection.ChildNode) -> Void) -> Disposable {
let name = String(describing: Cell.self)
let identifier = NSUserInterfaceItemIdentifier(rawValue: name)
let nib = NSNib(nibNamed: name, bundle: nil)
let nib = NSNib(nibNamed: NSNib.Name(name), bundle: nil)
outlineView.register(nib, forIdentifier: identifier)
return bind(to: outlineView, animated: animated, rowAnimation: rowAnimation, createCell: { (item, tableColumn, outlineView) -> NSView? in
guard let cell = outlineView.makeView(withIdentifier: identifier, owner: self) as? Cell else {
Expand All @@ -276,7 +276,7 @@ extension SignalProtocol where Element: TreeArrayChangesetConvertible, Error ==
public func bind<Cell: NSView>(to outlineView: NSOutlineView, cellType: Cell.Type, using binder: OutlineViewBinder<Element.Changeset>, configureCell: @escaping (Cell, Element.Changeset.Collection.ChildNode) -> Void) -> Disposable {
let name = String(describing: Cell.self)
let identifier = NSUserInterfaceItemIdentifier(rawValue: name)
let nib = NSNib(nibNamed: name, bundle: nil)
let nib = NSNib(nibNamed: NSNib.Name(name), bundle: nil)

outlineView.register(nib, forIdentifier: identifier)
binder.createCell = { (item, indexPath, tableView) -> NSView? in
Expand Down
Loading

0 comments on commit 6b75ec0

Please sign in to comment.