Commit eec4d581 authored by Silbino Goncalves Matado's avatar Silbino Goncalves Matado Committed by Alexandre Lision

CreateRingAccountViewController.swift: change superclass

Change superclass from UIViewController to UITableViewController
Add username and password fields

UITableViewController allows to automatically scroll to cells while
editing UITextField

Also added new cells :
- TextCell
- SwitchCell
- TextFieldCell

Using a simple UIViewController with a UITableView as subview does
not automatically scroll to the cells

Tuleap: #1400
Change-Id: I0837e30f006fdfd03aaa5e4914a15aa4f417b7f1
Reviewed-by: default avatarAlexandre Lision <alexandre.lision@savoirfairelinux.com>
parent 726c83d6
......@@ -111,6 +111,10 @@
5557FD4F1E81B2990043E394 /* AccountCredentialsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02DD80C91E1EAF1A009A3510 /* AccountCredentialsModel.swift */; };
557086521E8ADB9D001A7CE4 /* SystemAdapter.mm in Sources */ = {isa = PBXBuildFile; fileRef = 557086511E8ADB9D001A7CE4 /* SystemAdapter.mm */; };
56AC64D91E8012CA00EA1AA9 /* Walkthrough.strings in Resources */ = {isa = PBXBuildFile; fileRef = 56AC64DB1E8012CA00EA1AA9 /* Walkthrough.strings */; };
56AC64DF1E804ECC00EA1AA9 /* SwitchCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56AC64DE1E804ECC00EA1AA9 /* SwitchCell.swift */; };
56AC64E11E80542300EA1AA9 /* TextFieldCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56AC64E01E80542300EA1AA9 /* TextFieldCell.swift */; };
56AC64E31E805F0200EA1AA9 /* TextCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56AC64E21E805F0200EA1AA9 /* TextCell.swift */; };
56AC650E1E85694D00EA1AA9 /* RoundedTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56AC650D1E85694D00EA1AA9 /* RoundedTextField.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
......@@ -245,6 +249,10 @@
557086501E8ADB9D001A7CE4 /* SystemAdapter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SystemAdapter.h; path = Bridging/SystemAdapter.h; sourceTree = "<group>"; };
557086511E8ADB9D001A7CE4 /* SystemAdapter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = SystemAdapter.mm; path = Bridging/SystemAdapter.mm; sourceTree = "<group>"; };
56AC64DA1E8012CA00EA1AA9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Walkthrough.strings; sourceTree = "<group>"; };
56AC64DE1E804ECC00EA1AA9 /* SwitchCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwitchCell.swift; sourceTree = "<group>"; };
56AC64E01E80542300EA1AA9 /* TextFieldCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextFieldCell.swift; sourceTree = "<group>"; };
56AC64E21E805F0200EA1AA9 /* TextCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextCell.swift; sourceTree = "<group>"; };
56AC650D1E85694D00EA1AA9 /* RoundedTextField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RoundedTextField.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
......@@ -334,6 +342,7 @@
0273C3021E0C689600CF00BA /* Walkthrough */ = {
isa = PBXGroup;
children = (
56AC64DD1E804EB500EA1AA9 /* Cells */,
0273C3031E0C68B100CF00BA /* CreateProfileViewController.swift */,
0273C3041E0C68B100CF00BA /* CreateRingAccountViewController.swift */,
);
......@@ -443,6 +452,7 @@
children = (
0273C3071E0C68BF00CF00BA /* RoundedButton.swift */,
043866351D22D06500E06CE2 /* AccountTableViewCell.swift */,
56AC650D1E85694D00EA1AA9 /* RoundedTextField.swift */,
);
name = UI;
sourceTree = "<group>";
......@@ -611,6 +621,16 @@
name = Internationalization;
sourceTree = "<group>";
};
56AC64DD1E804EB500EA1AA9 /* Cells */ = {
isa = PBXGroup;
children = (
56AC64DE1E804ECC00EA1AA9 /* SwitchCell.swift */,
56AC64E01E80542300EA1AA9 /* TextFieldCell.swift */,
56AC64E21E805F0200EA1AA9 /* TextCell.swift */,
);
name = Cells;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
......@@ -777,10 +797,14 @@
02C9B63F1E1D4E8C00F82F0C /* ServiceEvent.swift in Sources */,
02DD80CD1E1EB2E4009A3510 /* ConfigKeyModel.swift in Sources */,
5516C29F1E71CEFF009D3D2D /* AccountModelHelper.swift in Sources */,
56AC64E11E80542300EA1AA9 /* TextFieldCell.swift in Sources */,
56AC64E31E805F0200EA1AA9 /* TextCell.swift in Sources */,
56AC650E1E85694D00EA1AA9 /* RoundedTextField.swift in Sources */,
02B22E011DF755E5000358C9 /* MainTabBarViewController.swift in Sources */,
043999F71D1C2D9D00E99CD9 /* AppDelegate.swift in Sources */,
02B22DFC1DF755BB000358C9 /* AccountModel.swift in Sources */,
043866331D22CE8C00E06CE2 /* MeViewController.swift in Sources */,
56AC64DF1E804ECC00EA1AA9 /* SwitchCell.swift in Sources */,
04399AAE1D1C304300E99CD9 /* Utils.mm in Sources */,
02B22DFD1DF755BB000358C9 /* CreateRingAccountViewModel.swift in Sources */,
043999FA1D1C2D9D00E99CD9 /* Ring.xcdatamodeld in Sources */,
......
......@@ -43,6 +43,8 @@ class CreateRingAccountViewModel {
*/
fileprivate var account: AccountModel?
var registerUsername = Variable<Bool>(true)
/**
The accountService instance injected in initializer.
*/
......
......@@ -24,3 +24,12 @@
"WelcomeText" = "A Ring account allows you to reach people securely in peer to peer through fully distributed network";
"LinkDeviceButton" = "Link this device to an account";
"CreateAccount" = "Create a Ring account";
//Create Account form
"CreateAccountFormTitle" = "Create your Ring account";
"RegisterPublicUsername" = "Register public username (experimental)";
"ChooseStrongPassword" = "Choose strong password you will remember to protect your Ring account.";
"EnterNewUsernamePlaceholder" = "Enter new username";
"NewPasswordPlaceholder" = "New Password";
"RepeatPasswordPlaceholder" = "Repeat new password";
/*
* Copyright (C) 2017 Savoir-faire Linux Inc.
*
* Author: Silbino Gonçalves Matado <silbino.gmatado@savoirfairelinux.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
import UIKit
class RoundedTextField: UITextField {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.layer.borderColor = UIColor.white.cgColor
self.layer.borderWidth = 1.0
self.clipsToBounds = true
}
override func layoutSubviews() {
super.layoutSubviews()
self.layer.cornerRadius = self.frame.size.height / 2.0
}
}
/*
* Copyright (C) 2017 Savoir-faire Linux Inc.
*
* Author: Silbino Gonçalves Matado <silbino.gmatado@savoirfairelinux.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
import UIKit
class SwitchCell: UITableViewCell {
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var registerSwitch: UISwitch!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
/*
* Copyright (C) 2017 Savoir-faire Linux Inc.
*
* Author: Silbino Gonçalves Matado <silbino.gmatado@savoirfairelinux.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
import UIKit
class TextCell: UITableViewCell {
@IBOutlet weak var label: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
/*
* Copyright (C) 2017 Savoir-faire Linux Inc.
*
* Author: Silbino Gonçalves Matado <silbino.gmatado@savoirfairelinux.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
import UIKit
class TextFieldCell: UITableViewCell {
@IBOutlet weak var textField: UITextField!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
......@@ -23,16 +23,37 @@ import UIKit
import RxCocoa
import RxSwift
class CreateRingAccountViewController: UIViewController {
fileprivate enum CreateRingAccountCellType {
case registerPublicUsername
case usernameField
case passwordNotice
case newPasswordField
case repeatPasswordField
}
class CreateRingAccountViewController: UITableViewController {
var mAccountViewModel = CreateRingAccountViewModel(withAccountService: AppDelegate.accountService)
@IBOutlet weak var mCreateAccountButton: RoundedButton!
@IBOutlet weak var mCreateAccountTitleLabel: UILabel!
/**
Cell identifiers
*/
let mSwitchCellId = "SwitchCellId"
let mTextFieldCellId = "TextFieldCellId"
let mTableViewCellId = "TableViewCellId"
var mDisposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
self.bindViews()
self.setupUI()
}
/**
......@@ -62,6 +83,24 @@ class CreateRingAccountViewController: UIViewController {
}
self?.setCreateAccountAsIdle()
})
_ = self.mAccountViewModel.registerUsername.asObservable()
.subscribe(onNext: { [weak self] showUsernameField in
self?.toggleRegisterSwitch(showUsernameField)
}).addDisposableTo(mDisposeBag)
}
/**
Customize the views
*/
fileprivate func setupUI() {
self.tableView.estimatedRowHeight = 44.0
self.tableView.rowHeight = UITableViewAutomaticDimension
self.mCreateAccountTitleLabel.text = NSLocalizedString("CreateAccountFormTitle",
tableName: LocalizedStringTableNames.walkthrough,
comment: "")
}
fileprivate func setCreateAccountAsLoading() {
......@@ -74,4 +113,89 @@ class CreateRingAccountViewController: UIViewController {
self.mCreateAccountButton.setTitle("Create a Ring account", for: .normal)
self.mCreateAccountButton.isUserInteractionEnabled = true
}
/**
Show or hide the username field cell in function of the switch state
*/
func toggleRegisterSwitch(_ show: Bool) {
let usernameFieldCellIndex = 1
if show && !mCells.contains(.usernameField) {
self.mCells.insert(.usernameField, at: usernameFieldCellIndex)
self.tableView.insertRows(at: [IndexPath(row: usernameFieldCellIndex, section: 0)],
with: .automatic)
} else if !show && mCells.contains(.usernameField) {
self.mCells.remove(at: usernameFieldCellIndex)
self.tableView.deleteRows(at: [IndexPath(row: usernameFieldCellIndex, section: 0)],
with: .automatic)
}
}
//MARK: TableView datasource
fileprivate var mCells :[CreateRingAccountCellType] = [.registerPublicUsername,
.passwordNotice,
.newPasswordField,
.repeatPasswordField]
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return mCells.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let currentCellType = mCells[indexPath.row]
if currentCellType == .registerPublicUsername {
let cell = tableView.dequeueReusableCell(withIdentifier: mSwitchCellId,
for: indexPath) as! SwitchCell
cell.titleLabel.text = NSLocalizedString("RegisterPublicUsername",
tableName: LocalizedStringTableNames.walkthrough,
comment: "")
cell.titleLabel.textColor = .white
_ = cell.registerSwitch.rx.value.bindTo(self.mAccountViewModel.registerUsername)
.addDisposableTo(mDisposeBag)
return cell
} else if currentCellType == .usernameField {
let cell = tableView.dequeueReusableCell(withIdentifier: mTextFieldCellId,
for: indexPath) as! TextFieldCell
cell.textField.isSecureTextEntry = false
cell.textField.placeholder = NSLocalizedString("EnterNewUsernamePlaceholder",
tableName: LocalizedStringTableNames.walkthrough,
comment: "")
return cell
} else if currentCellType == .passwordNotice {
let cell = tableView.dequeueReusableCell(withIdentifier: mTableViewCellId,
for: indexPath) as! TextCell
cell.label.text = NSLocalizedString("ChooseStrongPassword",
tableName: LocalizedStringTableNames.walkthrough,
comment: "")
return cell
} else if currentCellType == .newPasswordField {
let cell = tableView.dequeueReusableCell(withIdentifier: mTextFieldCellId,
for: indexPath) as! TextFieldCell
cell.textField.isSecureTextEntry = true
cell.textField.placeholder = NSLocalizedString("NewPasswordPlaceholder",
tableName: LocalizedStringTableNames.walkthrough,
comment: "")
return cell
} else {
let cell = tableView.dequeueReusableCell(withIdentifier: mTextFieldCellId,
for: indexPath) as! TextFieldCell
cell.textField.isSecureTextEntry = true
cell.textField.placeholder = NSLocalizedString("RepeatPasswordPlaceholder",
tableName: LocalizedStringTableNames.walkthrough,
comment: "")
return cell
}
}
}
......@@ -153,7 +153,7 @@
</constraints>
</view>
<connections>
<segue destination="ja8-pO-qtF" kind="show" identifier="ProfileToAccountSegue" id="3D3-9L-iuy"/>
<segue destination="kzh-87-Ao9" kind="show" identifier="ProfileToAccountSegue" id="CDO-bH-qiw"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="YDh-Qj-wfv" userLabel="First Responder" sceneMemberID="firstResponder"/>
......@@ -161,39 +161,154 @@
<point key="canvasLocation" x="1105" y="367"/>
</scene>
<!--Create Ring Account View Controller-->
<scene sceneID="hlW-WP-KN4">
<scene sceneID="XTt-go-ZNJ">
<objects>
<viewController id="ja8-pO-qtF" customClass="CreateRingAccountViewController" customModule="Ring" customModuleProvider="target" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="lys-bB-GcZ"/>
<viewControllerLayoutGuide type="bottom" id="5jn-tZ-fJ1"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="iHs-VJ-9vN">
<tableViewController id="kzh-87-Ao9" customClass="CreateRingAccountViewController" customModule="Ring" customModuleProvider="target" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="none" rowHeight="69" sectionHeaderHeight="28" sectionFooterHeight="28" id="e9y-lu-Idq">
<rect key="frame" x="0.0" y="0.0" width="320" height="480"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="exC-LF-5rp" customClass="RoundedButton" customModule="Ring" customModuleProvider="target">
<rect key="frame" x="84" y="225" width="152" height="30"/>
<color key="backgroundColor" red="0.0" green="0.29803921570000003" blue="0.37647058820000001" alpha="1" colorSpace="calibratedRGB"/>
<state key="normal" title="Create a Ring account">
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</state>
</button>
</subviews>
<color key="backgroundColor" red="0.039215686270000001" green="0.4549019608" blue="0.53725490200000003" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstItem="exC-LF-5rp" firstAttribute="centerY" secondItem="iHs-VJ-9vN" secondAttribute="centerY" id="3gQ-AK-GLL"/>
<constraint firstItem="exC-LF-5rp" firstAttribute="centerX" secondItem="iHs-VJ-9vN" secondAttribute="centerX" id="eBl-JO-6ae"/>
</constraints>
</view>
<view key="tableHeaderView" contentMode="scaleToFill" id="gnd-b0-Ncm">
<rect key="frame" x="0.0" y="0.0" width="320" height="130"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Create your Ring account" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="AIX-eC-baN">
<rect key="frame" x="8" y="8" width="304" height="114"/>
<fontDescription key="fontDescription" type="system" pointSize="24"/>
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="AIX-eC-baN" firstAttribute="leading" secondItem="gnd-b0-Ncm" secondAttribute="leading" constant="8" id="D6R-DY-N4I"/>
<constraint firstAttribute="trailing" secondItem="AIX-eC-baN" secondAttribute="trailing" constant="8" id="c58-zW-D8i"/>
<constraint firstAttribute="bottom" secondItem="AIX-eC-baN" secondAttribute="bottom" constant="8" id="k5Z-6d-hx8"/>
<constraint firstItem="AIX-eC-baN" firstAttribute="top" secondItem="gnd-b0-Ncm" secondAttribute="top" constant="8" id="peB-GQ-GOz"/>
</constraints>
</view>
<view key="tableFooterView" contentMode="scaleToFill" id="MnN-De-arJ">
<rect key="frame" x="0.0" y="365" width="320" height="54"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="gsT-SB-0AP" customClass="RoundedButton" customModule="Ring" customModuleProvider="target">
<rect key="frame" x="84" y="8" width="152" height="30"/>
<color key="backgroundColor" red="0.0" green="0.29803921570000003" blue="0.37647058820000001" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstAttribute="height" constant="30" id="KVf-AW-ms7"/>
</constraints>
<state key="normal" title="Create a Ring account">
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</state>
</button>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="gsT-SB-0AP" firstAttribute="top" secondItem="MnN-De-arJ" secondAttribute="top" constant="8" id="pqs-B0-TWU"/>
<constraint firstAttribute="bottom" secondItem="gsT-SB-0AP" secondAttribute="bottom" constant="16" id="qOI-R4-9EJ"/>
<constraint firstItem="gsT-SB-0AP" firstAttribute="centerX" secondItem="MnN-De-arJ" secondAttribute="centerX" id="tMA-Qg-oxa"/>
</constraints>
</view>
<prototypes>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="SwitchCellId" rowHeight="69" id="xv3-kL-wNV" customClass="SwitchCell" customModule="Ring" customModuleProvider="target">
<rect key="frame" x="0.0" y="158" width="320" height="69"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="xv3-kL-wNV" id="u8d-10-5fQ">
<rect key="frame" x="0.0" y="0.0" width="320" height="69"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" text="Register public username (experimental)" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="l6E-2a-51c">
<rect key="frame" x="16" y="8" width="231" height="52.5"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
</label>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" horizontalCompressionResistancePriority="751" verticalCompressionResistancePriority="751" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="eXQ-lo-PPY">
<rect key="frame" x="255" y="19" width="51" height="31"/>
</switch>
</subviews>
<constraints>
<constraint firstAttribute="bottom" secondItem="l6E-2a-51c" secondAttribute="bottom" constant="8" id="3mf-5d-kOd"/>
<constraint firstItem="eXQ-lo-PPY" firstAttribute="centerY" secondItem="u8d-10-5fQ" secondAttribute="centerY" id="UJ8-RD-ddQ"/>
<constraint firstItem="l6E-2a-51c" firstAttribute="leading" secondItem="u8d-10-5fQ" secondAttribute="leading" constant="16" id="UsX-gS-0TN"/>
<constraint firstAttribute="trailing" secondItem="eXQ-lo-PPY" secondAttribute="trailing" constant="16" id="cE9-Xf-bT3"/>
<constraint firstItem="eXQ-lo-PPY" firstAttribute="leading" secondItem="l6E-2a-51c" secondAttribute="trailing" constant="8" id="cyW-Kw-ea3"/>
<constraint firstItem="l6E-2a-51c" firstAttribute="top" secondItem="u8d-10-5fQ" secondAttribute="top" constant="8" id="oun-Kt-auw"/>
</constraints>
</tableViewCellContentView>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<connections>
<outlet property="registerSwitch" destination="eXQ-lo-PPY" id="SlD-P6-SiF"/>
<outlet property="titleLabel" destination="l6E-2a-51c" id="28k-pL-Ri6"/>
</connections>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="TextFieldCellId" rowHeight="69" id="hll-q9-QzR" customClass="TextFieldCell" customModule="Ring" customModuleProvider="target">
<rect key="frame" x="0.0" y="227" width="320" height="69"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="hll-q9-QzR" id="b0d-cJ-IJT">
<rect key="frame" x="0.0" y="0.0" width="320" height="69"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="dWn-2T-XDN" customClass="RoundedTextField" customModule="Ring" customModuleProvider="target">
<rect key="frame" x="16" y="8" width="288" height="52.5"/>
<nil key="textColor"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits" secureTextEntry="YES"/>
</textField>
</subviews>
<constraints>
<constraint firstAttribute="bottom" secondItem="dWn-2T-XDN" secondAttribute="bottom" constant="8" id="ExW-Ye-ifb"/>
<constraint firstAttribute="trailing" secondItem="dWn-2T-XDN" secondAttribute="trailing" constant="16" id="TZI-tk-XCc"/>
<constraint firstItem="dWn-2T-XDN" firstAttribute="top" secondItem="b0d-cJ-IJT" secondAttribute="top" constant="8" id="gXN-EW-HYY"/>
<constraint firstItem="dWn-2T-XDN" firstAttribute="leading" secondItem="b0d-cJ-IJT" secondAttribute="leading" constant="16" id="zAm-rb-vhR"/>
</constraints>
</tableViewCellContentView>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<connections>
<outlet property="textField" destination="dWn-2T-XDN" id="xz6-aa-Izw"/>
</connections>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="TableViewCellId" rowHeight="69" id="ExW-Pf-YtL" customClass="TextCell" customModule="Ring" customModuleProvider="target">
<rect key="frame" x="0.0" y="296" width="320" height="69"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="ExW-Pf-YtL" id="D4j-0H-Fhi">
<rect key="frame" x="0.0" y="0.0" width="320" height="69"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="tqa-H7-iG3">
<rect key="frame" x="16" y="8" width="288" height="52.5"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstAttribute="trailing" secondItem="tqa-H7-iG3" secondAttribute="trailing" constant="16" id="VN7-fC-5Av"/>
<constraint firstItem="tqa-H7-iG3" firstAttribute="leading" secondItem="D4j-0H-Fhi" secondAttribute="leading" constant="16" id="ghI-k7-j7e"/>
<constraint firstAttribute="bottom" secondItem="tqa-H7-iG3" secondAttribute="bottom" constant="8" id="r6B-sj-b0Z"/>
<constraint firstItem="tqa-H7-iG3" firstAttribute="top" secondItem="D4j-0H-Fhi" secondAttribute="top" constant="8" id="vYA-FB-IGa"/>
</constraints>
</tableViewCellContentView>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<connections>
<outlet property="label" destination="tqa-H7-iG3" id="LDf-uD-qqo"/>
</connections>
</tableViewCell>
</prototypes>
<connections>
<outlet property="dataSource" destination="kzh-87-Ao9" id="fWb-k5-HBL"/>
<outlet property="delegate" destination="kzh-87-Ao9" id="DE2-dv-wl2"/>
</connections>
</tableView>
<connections>
<outlet property="mCreateAccountButton" destination="exC-LF-5rp" id="z71-gN-58V"/>
<segue destination="E3W-r7-J4y" kind="show" identifier="AccountToPermissionsSegue" id="KYM-Jg-1oB"/>
<outlet property="mCreateAccountButton" destination="gsT