mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-02-02 01:08:19 +00:00
Parse JSON network list into Network objects for the view
This commit is contained in:
parent
da30d2898e
commit
d5620288d5
@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
9330F1351CEAB4C400687EC8 /* ServiceCom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9330F1341CEAB4C400687EC8 /* ServiceCom.swift */; };
|
9330F1351CEAB4C400687EC8 /* ServiceCom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9330F1341CEAB4C400687EC8 /* ServiceCom.swift */; };
|
||||||
|
9330F1371CEBF87200687EC8 /* Network.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9330F1361CEBF87200687EC8 /* Network.swift */; };
|
||||||
93326BDC1CE7C816005CA2AC /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93326BDB1CE7C816005CA2AC /* AppDelegate.swift */; };
|
93326BDC1CE7C816005CA2AC /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93326BDB1CE7C816005CA2AC /* AppDelegate.swift */; };
|
||||||
93326BDE1CE7C816005CA2AC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 93326BDD1CE7C816005CA2AC /* Assets.xcassets */; };
|
93326BDE1CE7C816005CA2AC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 93326BDD1CE7C816005CA2AC /* Assets.xcassets */; };
|
||||||
93326BE11CE7C816005CA2AC /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 93326BDF1CE7C816005CA2AC /* MainMenu.xib */; };
|
93326BE11CE7C816005CA2AC /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 93326BDF1CE7C816005CA2AC /* MainMenu.xib */; };
|
||||||
@ -19,6 +20,7 @@
|
|||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
9330F1341CEAB4C400687EC8 /* ServiceCom.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServiceCom.swift; sourceTree = "<group>"; };
|
9330F1341CEAB4C400687EC8 /* ServiceCom.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServiceCom.swift; sourceTree = "<group>"; };
|
||||||
|
9330F1361CEBF87200687EC8 /* Network.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Network.swift; sourceTree = "<group>"; };
|
||||||
93326BD81CE7C816005CA2AC /* ZeroTier One.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ZeroTier One.app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
93326BD81CE7C816005CA2AC /* ZeroTier One.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ZeroTier One.app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
93326BDB1CE7C816005CA2AC /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
93326BDB1CE7C816005CA2AC /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||||
93326BDD1CE7C816005CA2AC /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
93326BDD1CE7C816005CA2AC /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||||
@ -62,6 +64,7 @@
|
|||||||
children = (
|
children = (
|
||||||
93326BDB1CE7C816005CA2AC /* AppDelegate.swift */,
|
93326BDB1CE7C816005CA2AC /* AppDelegate.swift */,
|
||||||
93326BE81CE7D9B9005CA2AC /* JoinNetworkViewController.swift */,
|
93326BE81CE7D9B9005CA2AC /* JoinNetworkViewController.swift */,
|
||||||
|
9330F1361CEBF87200687EC8 /* Network.swift */,
|
||||||
93326BEC1CE7DA30005CA2AC /* ShowNetworksViewController.swift */,
|
93326BEC1CE7DA30005CA2AC /* ShowNetworksViewController.swift */,
|
||||||
9330F1341CEAB4C400687EC8 /* ServiceCom.swift */,
|
9330F1341CEAB4C400687EC8 /* ServiceCom.swift */,
|
||||||
93326BDD1CE7C816005CA2AC /* Assets.xcassets */,
|
93326BDD1CE7C816005CA2AC /* Assets.xcassets */,
|
||||||
@ -145,6 +148,7 @@
|
|||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
9330F1371CEBF87200687EC8 /* Network.swift in Sources */,
|
||||||
93326BDC1CE7C816005CA2AC /* AppDelegate.swift in Sources */,
|
93326BDC1CE7C816005CA2AC /* AppDelegate.swift in Sources */,
|
||||||
93326BEA1CE7D9B9005CA2AC /* JoinNetworkViewController.swift in Sources */,
|
93326BEA1CE7D9B9005CA2AC /* JoinNetworkViewController.swift in Sources */,
|
||||||
93326BEE1CE7DA30005CA2AC /* ShowNetworksViewController.swift in Sources */,
|
93326BEE1CE7DA30005CA2AC /* ShowNetworksViewController.swift in Sources */,
|
||||||
|
112
ZeroTier One/Network.swift
Normal file
112
ZeroTier One/Network.swift
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
//
|
||||||
|
// Network.swift
|
||||||
|
// ZeroTier One
|
||||||
|
//
|
||||||
|
// Created by Grant Limberg on 5/17/16.
|
||||||
|
// Copyright © 2016 ZeroTier, Inc. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Cocoa
|
||||||
|
|
||||||
|
enum NetworkStatus : CustomStringConvertible {
|
||||||
|
case REQUESTING_CONFIGURATION
|
||||||
|
case OK
|
||||||
|
case ACCESS_DENIED
|
||||||
|
case NOT_FOUND
|
||||||
|
case PORT_ERROR
|
||||||
|
case CLIENT_TOO_OLD
|
||||||
|
|
||||||
|
var description: String {
|
||||||
|
switch self {
|
||||||
|
case .REQUESTING_CONFIGURATION: return "REQUESTING_CONFIGURATION"
|
||||||
|
case .OK: return "OK"
|
||||||
|
case .ACCESS_DENIED: return "ACCESS_DENIED"
|
||||||
|
case .NOT_FOUND: return "NOT_FOUND"
|
||||||
|
case .PORT_ERROR: return "PORT_ERROR"
|
||||||
|
case .CLIENT_TOO_OLD: return "CLIENT_TOO_OLD"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enum NetworkType: CustomStringConvertible {
|
||||||
|
case PUBLIC
|
||||||
|
case PRIVATE
|
||||||
|
|
||||||
|
var description: String {
|
||||||
|
switch self {
|
||||||
|
case .PUBLIC: return "PUBLIC"
|
||||||
|
case .PRIVATE: return "PRIVATE"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Network: NSObject {
|
||||||
|
var assignedAddresses: [String] = [String]()
|
||||||
|
var bridge: Bool = false
|
||||||
|
var broadcastEnabled: Bool = false
|
||||||
|
var dhcp: Bool = false
|
||||||
|
var mac: String = ""
|
||||||
|
var mtu: Int = 0
|
||||||
|
var multicastSubscriptions: [String] = [String]()
|
||||||
|
var name: String = ""
|
||||||
|
var netconfRevision: Int = 232
|
||||||
|
var nwid: UInt64 = 0
|
||||||
|
var portDeviceName: String = ""
|
||||||
|
var portError: Int = 0
|
||||||
|
var status: NetworkStatus = .REQUESTING_CONFIGURATION
|
||||||
|
var type: NetworkType = .PRIVATE
|
||||||
|
|
||||||
|
init(jsonData: [String: AnyObject]) {
|
||||||
|
super.init()
|
||||||
|
|
||||||
|
let aa = jsonData["assignedAddresses"] as! [String]
|
||||||
|
for a in aa {
|
||||||
|
assignedAddresses.append(a)
|
||||||
|
}
|
||||||
|
|
||||||
|
bridge = (jsonData["bridge"] as! NSNumber).boolValue
|
||||||
|
broadcastEnabled = (jsonData["broadcastEnabled"] as! NSNumber).boolValue
|
||||||
|
dhcp = (jsonData["dhcp"] as! NSNumber).boolValue
|
||||||
|
mac = jsonData["mac"] as! String
|
||||||
|
mtu = (jsonData["mtu"] as! NSNumber).integerValue
|
||||||
|
|
||||||
|
let multSubs = jsonData["multicastSubscriptions"] as! [String]
|
||||||
|
for ms in multSubs {
|
||||||
|
multicastSubscriptions.append(ms)
|
||||||
|
}
|
||||||
|
|
||||||
|
name = jsonData["name"] as! String
|
||||||
|
netconfRevision = (jsonData["netconfRevision"] as! NSNumber).integerValue
|
||||||
|
nwid = UInt64((jsonData["nwid"] as! String), radix: 16)!
|
||||||
|
portDeviceName = jsonData["portDeviceName"] as! String
|
||||||
|
portError = (jsonData["portError"] as! NSNumber).integerValue
|
||||||
|
|
||||||
|
let statusStr = jsonData["status"] as! String
|
||||||
|
switch statusStr {
|
||||||
|
case "REQUESTING_CONFIGURATION":
|
||||||
|
status = .REQUESTING_CONFIGURATION
|
||||||
|
case "OK":
|
||||||
|
status = .OK
|
||||||
|
case "ACCESS_DENIED":
|
||||||
|
status = .ACCESS_DENIED
|
||||||
|
case "NOT_FOUND":
|
||||||
|
status = .NOT_FOUND
|
||||||
|
case "PORT_ERROR":
|
||||||
|
status = .PORT_ERROR
|
||||||
|
case "CLIENT_TOO_OLD":
|
||||||
|
status = .CLIENT_TOO_OLD
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
let typeStr = jsonData["type"] as! String
|
||||||
|
switch typeStr {
|
||||||
|
case "PRIVATE":
|
||||||
|
type = .PRIVATE
|
||||||
|
case "PUBLIC":
|
||||||
|
type = .PUBLIC
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -12,7 +12,7 @@ class ServiceCom: NSObject {
|
|||||||
static let baseURL = "http://localhost:9993"
|
static let baseURL = "http://localhost:9993"
|
||||||
static var key: NSString? = "ddeb3b1e6996b6b4f2d12d10"
|
static var key: NSString? = "ddeb3b1e6996b6b4f2d12d10"
|
||||||
|
|
||||||
static func getNetworkList() {
|
static func getNetworkList(completionHandler: ([Network]) -> Void) {
|
||||||
|
|
||||||
let urlString = baseURL + "/network?auth=\(ServiceCom.key!)"
|
let urlString = baseURL + "/network?auth=\(ServiceCom.key!)"
|
||||||
|
|
||||||
@ -27,11 +27,16 @@ class ServiceCom: NSObject {
|
|||||||
|
|
||||||
if status == 200 {
|
if status == 200 {
|
||||||
do {
|
do {
|
||||||
let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions())
|
let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions()) as! [[String: AnyObject]]
|
||||||
print("\(json)")
|
|
||||||
|
var networks = [Network]()
|
||||||
|
for jobj in json {
|
||||||
|
networks.append(Network(jsonData: jobj))
|
||||||
|
}
|
||||||
|
|
||||||
|
completionHandler(networks)
|
||||||
}
|
}
|
||||||
catch {
|
catch {
|
||||||
print("JSON Error: \(error)")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,19 +8,36 @@
|
|||||||
|
|
||||||
import Cocoa
|
import Cocoa
|
||||||
|
|
||||||
class ShowNetworksViewController: NSViewController {
|
class ShowNetworksViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource {
|
||||||
|
|
||||||
@IBOutlet var tableView: NSTableView!
|
@IBOutlet var tableView: NSTableView!
|
||||||
|
|
||||||
|
var networkList: [Network] = [Network]()
|
||||||
|
|
||||||
override func viewDidLoad() {
|
override func viewDidLoad() {
|
||||||
super.viewDidLoad()
|
super.viewDidLoad()
|
||||||
// Do view setup here.
|
// Do view setup here.
|
||||||
|
|
||||||
|
tableView.setDelegate(self)
|
||||||
|
tableView.setDataSource(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
override func viewWillAppear() {
|
override func viewWillAppear() {
|
||||||
super.viewWillAppear()
|
super.viewWillAppear()
|
||||||
|
|
||||||
ServiceCom.getNetworkList()
|
ServiceCom.getNetworkList() { (networkList) -> Void in
|
||||||
|
NSOperationQueue.mainQueue().addOperationWithBlock() { () -> Void in
|
||||||
|
self.networkList = networkList
|
||||||
|
self.tableView.reloadData()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NSTableViewDataSource
|
||||||
|
|
||||||
|
func numberOfRowsInTableView(tableView: NSTableView) -> Int {
|
||||||
|
return networkList.count
|
||||||
|
}
|
||||||
|
|
||||||
|
// end NSTableViewDataSource
|
||||||
}
|
}
|
||||||
|
@ -20,17 +20,17 @@
|
|||||||
<scrollView fixedFrame="YES" autohidesScrollers="YES" horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="miH-DQ-i4L">
|
<scrollView fixedFrame="YES" autohidesScrollers="YES" horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="miH-DQ-i4L">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
|
<rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
|
||||||
<clipView key="contentView" ambiguous="YES" id="KXW-dX-mx6">
|
<clipView key="contentView" ambiguous="YES" id="KXW-dX-mx6">
|
||||||
<rect key="frame" x="1" y="23" width="478" height="248"/>
|
<rect key="frame" x="1" y="1" width="478" height="270"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<tableView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnSelection="YES" multipleSelection="NO" autosaveColumns="NO" rowSizeStyle="automatic" headerView="Vk4-NS-T5F" viewBased="YES" id="w5O-vn-cYB">
|
<tableView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" selectionHighlightStyle="none" columnReordering="NO" multipleSelection="NO" autosaveColumns="NO" rowSizeStyle="automatic" viewBased="YES" id="w5O-vn-cYB">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="478" height="248"/>
|
<rect key="frame" x="0.0" y="0.0" width="478" height="270"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<size key="intercellSpacing" width="3" height="2"/>
|
<size key="intercellSpacing" width="3" height="2"/>
|
||||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
|
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
|
||||||
<tableColumns>
|
<tableColumns>
|
||||||
<tableColumn width="116" minWidth="40" maxWidth="1000" id="ztK-JB-A6Q">
|
<tableColumn width="475" minWidth="40" maxWidth="1000" id="ztK-JB-A6Q">
|
||||||
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
|
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
|
||||||
<font key="font" metaFont="smallSystem"/>
|
<font key="font" metaFont="smallSystem"/>
|
||||||
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
|
||||||
@ -44,7 +44,7 @@
|
|||||||
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
|
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
|
||||||
<prototypeCellViews>
|
<prototypeCellViews>
|
||||||
<tableCellView id="j2t-oK-WVh">
|
<tableCellView id="j2t-oK-WVh">
|
||||||
<rect key="frame" x="1" y="1" width="116" height="17"/>
|
<rect key="frame" x="1" y="1" width="475" height="17"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="rgC-R0-GUv">
|
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="rgC-R0-GUv">
|
||||||
@ -62,44 +62,12 @@
|
|||||||
</tableCellView>
|
</tableCellView>
|
||||||
</prototypeCellViews>
|
</prototypeCellViews>
|
||||||
</tableColumn>
|
</tableColumn>
|
||||||
<tableColumn width="356" minWidth="40" maxWidth="1000" id="gp2-yI-hbi">
|
|
||||||
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
|
|
||||||
<font key="font" metaFont="smallSystem"/>
|
|
||||||
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
|
|
||||||
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
|
|
||||||
</tableHeaderCell>
|
|
||||||
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="0Oh-Cz-89i">
|
|
||||||
<font key="font" metaFont="system"/>
|
|
||||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
|
||||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
|
||||||
</textFieldCell>
|
|
||||||
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
|
|
||||||
<prototypeCellViews>
|
|
||||||
<tableCellView id="NLE-q5-NvF">
|
|
||||||
<rect key="frame" x="120" y="1" width="356" height="17"/>
|
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
|
||||||
<subviews>
|
|
||||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="pqD-85-mZt">
|
|
||||||
<rect key="frame" x="0.0" y="0.0" width="100" height="17"/>
|
|
||||||
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="5Vv-q1-uNw">
|
|
||||||
<font key="font" metaFont="system"/>
|
|
||||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
|
||||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
|
||||||
</textFieldCell>
|
|
||||||
</textField>
|
|
||||||
</subviews>
|
|
||||||
<connections>
|
|
||||||
<outlet property="textField" destination="pqD-85-mZt" id="0rP-8V-ny1"/>
|
|
||||||
</connections>
|
|
||||||
</tableCellView>
|
|
||||||
</prototypeCellViews>
|
|
||||||
</tableColumn>
|
|
||||||
</tableColumns>
|
</tableColumns>
|
||||||
</tableView>
|
</tableView>
|
||||||
</subviews>
|
</subviews>
|
||||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
</clipView>
|
</clipView>
|
||||||
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="0.5" horizontal="YES" id="ySn-XX-fde">
|
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="ySn-XX-fde">
|
||||||
<rect key="frame" x="1" y="256" width="478" height="15"/>
|
<rect key="frame" x="1" y="256" width="478" height="15"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
</scroller>
|
</scroller>
|
||||||
@ -107,10 +75,6 @@
|
|||||||
<rect key="frame" x="224" y="17" width="15" height="102"/>
|
<rect key="frame" x="224" y="17" width="15" height="102"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
</scroller>
|
</scroller>
|
||||||
<tableHeaderView key="headerView" id="Vk4-NS-T5F">
|
|
||||||
<rect key="frame" x="0.0" y="0.0" width="478" height="23"/>
|
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
|
||||||
</tableHeaderView>
|
|
||||||
</scrollView>
|
</scrollView>
|
||||||
</subviews>
|
</subviews>
|
||||||
</customView>
|
</customView>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user