Add Feedbin account and delete account functionality added to iOS
This commit is contained in:
parent
16f2f43cc7
commit
50b68096cd
@ -28,6 +28,7 @@
|
|||||||
5144EA52227B8E4500D19003 /* AccountsFeedbin.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5144EA50227B8E4500D19003 /* AccountsFeedbin.xib */; };
|
5144EA52227B8E4500D19003 /* AccountsFeedbin.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5144EA50227B8E4500D19003 /* AccountsFeedbin.xib */; };
|
||||||
51543685228F6753005E1CDF /* DetailAccountViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51543684228F6753005E1CDF /* DetailAccountViewController.swift */; };
|
51543685228F6753005E1CDF /* DetailAccountViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51543684228F6753005E1CDF /* DetailAccountViewController.swift */; };
|
||||||
515436882291D75D005E1CDF /* AddLocalAccountViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 515436872291D75D005E1CDF /* AddLocalAccountViewController.swift */; };
|
515436882291D75D005E1CDF /* AddLocalAccountViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 515436872291D75D005E1CDF /* AddLocalAccountViewController.swift */; };
|
||||||
|
5154368A2291FED9005E1CDF /* FeedbinAccountViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 515436892291FED9005E1CDF /* FeedbinAccountViewController.swift */; };
|
||||||
51554C24228B71910055115A /* SyncDatabase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51554C01228B6EB50055115A /* SyncDatabase.framework */; };
|
51554C24228B71910055115A /* SyncDatabase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51554C01228B6EB50055115A /* SyncDatabase.framework */; };
|
||||||
51554C25228B71910055115A /* SyncDatabase.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 51554C01228B6EB50055115A /* SyncDatabase.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
51554C25228B71910055115A /* SyncDatabase.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 51554C01228B6EB50055115A /* SyncDatabase.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||||
51554C30228B71A10055115A /* SyncDatabase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51554C01228B6EB50055115A /* SyncDatabase.framework */; };
|
51554C30228B71A10055115A /* SyncDatabase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51554C01228B6EB50055115A /* SyncDatabase.framework */; };
|
||||||
@ -677,6 +678,7 @@
|
|||||||
5144EA50227B8E4500D19003 /* AccountsFeedbin.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AccountsFeedbin.xib; sourceTree = "<group>"; };
|
5144EA50227B8E4500D19003 /* AccountsFeedbin.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AccountsFeedbin.xib; sourceTree = "<group>"; };
|
||||||
51543684228F6753005E1CDF /* DetailAccountViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailAccountViewController.swift; sourceTree = "<group>"; };
|
51543684228F6753005E1CDF /* DetailAccountViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailAccountViewController.swift; sourceTree = "<group>"; };
|
||||||
515436872291D75D005E1CDF /* AddLocalAccountViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddLocalAccountViewController.swift; sourceTree = "<group>"; };
|
515436872291D75D005E1CDF /* AddLocalAccountViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddLocalAccountViewController.swift; sourceTree = "<group>"; };
|
||||||
|
515436892291FED9005E1CDF /* FeedbinAccountViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbinAccountViewController.swift; sourceTree = "<group>"; };
|
||||||
51554BFC228B6EB50055115A /* SyncDatabase.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SyncDatabase.xcodeproj; path = Frameworks/SyncDatabase/SyncDatabase.xcodeproj; sourceTree = SOURCE_ROOT; };
|
51554BFC228B6EB50055115A /* SyncDatabase.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SyncDatabase.xcodeproj; path = Frameworks/SyncDatabase/SyncDatabase.xcodeproj; sourceTree = SOURCE_ROOT; };
|
||||||
5183CCCF226E1E880010922C /* NonIntrinsicLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonIntrinsicLabel.swift; sourceTree = "<group>"; };
|
5183CCCF226E1E880010922C /* NonIntrinsicLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonIntrinsicLabel.swift; sourceTree = "<group>"; };
|
||||||
5183CCD9226E31A50010922C /* NonIntrinsicImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonIntrinsicImageView.swift; sourceTree = "<group>"; };
|
5183CCD9226E31A50010922C /* NonIntrinsicImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonIntrinsicImageView.swift; sourceTree = "<group>"; };
|
||||||
@ -1042,6 +1044,7 @@
|
|||||||
51E595AA228DF94C00FCC42B /* SettingsTableViewCell.xib */,
|
51E595AA228DF94C00FCC42B /* SettingsTableViewCell.xib */,
|
||||||
5183CCEE227125970010922C /* SettingsViewController.swift */,
|
5183CCEE227125970010922C /* SettingsViewController.swift */,
|
||||||
51E595AC228E1C2100FCC42B /* AddAccountViewController.swift */,
|
51E595AC228E1C2100FCC42B /* AddAccountViewController.swift */,
|
||||||
|
515436892291FED9005E1CDF /* FeedbinAccountViewController.swift */,
|
||||||
515436872291D75D005E1CDF /* AddLocalAccountViewController.swift */,
|
515436872291D75D005E1CDF /* AddLocalAccountViewController.swift */,
|
||||||
51F85BE6227245FC00C787DC /* AboutViewController.swift */,
|
51F85BE6227245FC00C787DC /* AboutViewController.swift */,
|
||||||
51543684228F6753005E1CDF /* DetailAccountViewController.swift */,
|
51543684228F6753005E1CDF /* DetailAccountViewController.swift */,
|
||||||
@ -2340,6 +2343,7 @@
|
|||||||
512E09352268B25900BDCFDD /* UISplitViewController-Extensions.swift in Sources */,
|
512E09352268B25900BDCFDD /* UISplitViewController-Extensions.swift in Sources */,
|
||||||
51C452A022650A1900C03939 /* FeedIconDownloader.swift in Sources */,
|
51C452A022650A1900C03939 /* FeedIconDownloader.swift in Sources */,
|
||||||
51F85BE7227245FC00C787DC /* AboutViewController.swift in Sources */,
|
51F85BE7227245FC00C787DC /* AboutViewController.swift in Sources */,
|
||||||
|
5154368A2291FED9005E1CDF /* FeedbinAccountViewController.swift in Sources */,
|
||||||
51C4529E22650A1900C03939 /* ImageDownloader.swift in Sources */,
|
51C4529E22650A1900C03939 /* ImageDownloader.swift in Sources */,
|
||||||
51C45292226509C800C03939 /* TodayFeedDelegate.swift in Sources */,
|
51C45292226509C800C03939 /* TodayFeedDelegate.swift in Sources */,
|
||||||
51C452A222650A1900C03939 /* RSHTMLMetadata+Extension.swift in Sources */,
|
51C452A222650A1900C03939 /* RSHTMLMetadata+Extension.swift in Sources */,
|
||||||
|
@ -8,16 +8,31 @@
|
|||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
class AddAccountViewController: UITableViewController {
|
protocol AddAccountDismissDelegate: UIViewController {
|
||||||
|
func dismiss()
|
||||||
|
}
|
||||||
|
|
||||||
|
class AddAccountViewController: UITableViewController, AddAccountDismissDelegate {
|
||||||
|
|
||||||
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
||||||
switch indexPath.row {
|
switch indexPath.row {
|
||||||
case 0:
|
case 0:
|
||||||
let viewController = UIStoryboard.settings.instantiateViewController(withIdentifier: "AddLocalAccountNavigationViewController")
|
let navController = UIStoryboard.settings.instantiateViewController(withIdentifier: "AddLocalAccountNavigationViewController") as! UINavigationController
|
||||||
present(viewController, animated: true)
|
let addViewController = navController.topViewController as! AddLocalAccountViewController
|
||||||
|
addViewController.delegate = self
|
||||||
|
present(navController, animated: true)
|
||||||
|
case 1:
|
||||||
|
let navController = UIStoryboard.settings.instantiateViewController(withIdentifier: "FeedbinAccountNavigationViewController") as! UINavigationController
|
||||||
|
let addViewController = navController.topViewController as! FeedbinAccountViewController
|
||||||
|
addViewController.delegate = self
|
||||||
|
present(navController, animated: true)
|
||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func dismiss() {
|
||||||
|
navigationController?.popViewController(animated: false)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,8 @@ import Account
|
|||||||
class AddLocalAccountViewController: UIViewController {
|
class AddLocalAccountViewController: UIViewController {
|
||||||
|
|
||||||
@IBOutlet weak var nameTextField: UITextField!
|
@IBOutlet weak var nameTextField: UITextField!
|
||||||
|
weak var delegate: AddAccountDismissDelegate?
|
||||||
|
|
||||||
@IBAction func cancel(_ sender: Any) {
|
@IBAction func cancel(_ sender: Any) {
|
||||||
dismiss(animated: true)
|
dismiss(animated: true)
|
||||||
}
|
}
|
||||||
@ -21,6 +22,7 @@ class AddLocalAccountViewController: UIViewController {
|
|||||||
let account = AccountManager.shared.createAccount(type: .onMyMac)
|
let account = AccountManager.shared.createAccount(type: .onMyMac)
|
||||||
account.name = nameTextField.text
|
account.name = nameTextField.text
|
||||||
dismiss(animated: true)
|
dismiss(animated: true)
|
||||||
|
delegate?.dismiss()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,6 @@ class DetailAccountViewController: UITableViewController {
|
|||||||
guard let account = account else { return }
|
guard let account = account else { return }
|
||||||
nameTextField.text = account.name
|
nameTextField.text = account.name
|
||||||
activeSwitch.isOn = account.isActive
|
activeSwitch.isOn = account.isActive
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override func viewWillDisappear(_ animated: Bool) {
|
override func viewWillDisappear(_ animated: Bool) {
|
||||||
@ -30,4 +29,53 @@ class DetailAccountViewController: UITableViewController {
|
|||||||
account?.isActive = activeSwitch.isOn
|
account?.isActive = activeSwitch.isOn
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override func numberOfSections(in tableView: UITableView) -> Int {
|
||||||
|
if account == AccountManager.shared.defaultAccount {
|
||||||
|
return 1
|
||||||
|
} else {
|
||||||
|
return super.numberOfSections(in: tableView)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
||||||
|
let cell = super.tableView(tableView, cellForRowAt: indexPath)
|
||||||
|
|
||||||
|
let bgView = UIView()
|
||||||
|
bgView.backgroundColor = AppAssets.selectionBackgroundColor
|
||||||
|
cell.selectedBackgroundView = bgView
|
||||||
|
return cell
|
||||||
|
}
|
||||||
|
|
||||||
|
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
||||||
|
if indexPath.section == 1 {
|
||||||
|
deleteAccount()
|
||||||
|
}
|
||||||
|
|
||||||
|
tableView.selectRow(at: nil, animated: true, scrollPosition: .none)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private extension DetailAccountViewController {
|
||||||
|
|
||||||
|
func deleteAccount() {
|
||||||
|
let title = NSLocalizedString("Delete Account", comment: "Delete Account")
|
||||||
|
let message = NSLocalizedString("Are you sure you want to delete this account? This can not be undone.", comment: "Delete Account")
|
||||||
|
let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
|
||||||
|
|
||||||
|
let cancelTitle = NSLocalizedString("Cancel", comment: "Cancel")
|
||||||
|
let cancelAction = UIAlertAction(title: cancelTitle, style: .cancel)
|
||||||
|
alertController.addAction(cancelAction)
|
||||||
|
|
||||||
|
let markTitle = NSLocalizedString("Delete", comment: "Delete")
|
||||||
|
let markAction = UIAlertAction(title: markTitle, style: .default) { [weak self] (action) in
|
||||||
|
guard let account = self?.account else { return }
|
||||||
|
AccountManager.shared.deleteAccount(account)
|
||||||
|
self?.navigationController?.popViewController(animated: true)
|
||||||
|
}
|
||||||
|
alertController.addAction(markAction)
|
||||||
|
|
||||||
|
present(alertController, animated: true)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
103
iOS/Settings/FeedbinAccountViewController.swift
Normal file
103
iOS/Settings/FeedbinAccountViewController.swift
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
//
|
||||||
|
// AddFeedbinAccountViewController.swift
|
||||||
|
// NetNewsWire-iOS
|
||||||
|
//
|
||||||
|
// Created by Maurice Parker on 5/19/19.
|
||||||
|
// Copyright © 2019 Ranchero Software. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import UIKit
|
||||||
|
import Account
|
||||||
|
import RSWeb
|
||||||
|
|
||||||
|
class FeedbinAccountViewController: UIViewController {
|
||||||
|
|
||||||
|
@IBOutlet weak var cancelBarButtonItem: UIBarButtonItem!
|
||||||
|
@IBOutlet weak var activityIndicator: UIActivityIndicatorView!
|
||||||
|
@IBOutlet weak var doneBarButtonItem: UIBarButtonItem!
|
||||||
|
@IBOutlet weak var emailTextField: UITextField!
|
||||||
|
@IBOutlet weak var passwordTextField: UITextField!
|
||||||
|
@IBOutlet weak var errorMessageLabel: UILabel!
|
||||||
|
|
||||||
|
weak var account: Account?
|
||||||
|
weak var delegate: AddAccountDismissDelegate?
|
||||||
|
|
||||||
|
override func viewDidLoad() {
|
||||||
|
super.viewDidLoad()
|
||||||
|
|
||||||
|
activityIndicator.isHidden = true
|
||||||
|
|
||||||
|
if let account = account, let credentials = try? account.retrieveBasicCredentials() {
|
||||||
|
if case .basic(let username, let password) = credentials {
|
||||||
|
emailTextField.text = username
|
||||||
|
passwordTextField.text = password
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@IBAction func cancel(_ sender: Any) {
|
||||||
|
dismiss(animated: true)
|
||||||
|
}
|
||||||
|
|
||||||
|
@IBAction func done(_ sender: Any) {
|
||||||
|
|
||||||
|
self.errorMessageLabel.text = nil
|
||||||
|
|
||||||
|
guard emailTextField.text != nil && passwordTextField.text != nil else {
|
||||||
|
self.errorMessageLabel.text = NSLocalizedString("Username & password required.", comment: "Credentials Error")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
cancelBarButtonItem.isEnabled = false
|
||||||
|
doneBarButtonItem.isEnabled = false
|
||||||
|
activityIndicator.isHidden = false
|
||||||
|
activityIndicator.startAnimating()
|
||||||
|
|
||||||
|
let credentials = Credentials.basic(username: emailTextField.text ?? "", password: passwordTextField.text ?? "")
|
||||||
|
Account.validateCredentials(type: .feedbin, credentials: credentials) { [weak self] result in
|
||||||
|
|
||||||
|
guard let self = self else { return }
|
||||||
|
|
||||||
|
self.cancelBarButtonItem.isEnabled = true
|
||||||
|
self.doneBarButtonItem.isEnabled = true
|
||||||
|
self.activityIndicator.isHidden = true
|
||||||
|
self.activityIndicator.stopAnimating()
|
||||||
|
|
||||||
|
switch result {
|
||||||
|
case .success(let authenticated):
|
||||||
|
|
||||||
|
if authenticated {
|
||||||
|
|
||||||
|
var newAccount = false
|
||||||
|
if self.account == nil {
|
||||||
|
self.account = AccountManager.shared.createAccount(type: .feedbin)
|
||||||
|
newAccount = true
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
try self.account?.removeBasicCredentials()
|
||||||
|
try self.account?.storeCredentials(credentials)
|
||||||
|
if newAccount {
|
||||||
|
self.account?.refreshAll()
|
||||||
|
}
|
||||||
|
self.dismiss(animated: true)
|
||||||
|
self.delegate?.dismiss()
|
||||||
|
} catch {
|
||||||
|
self.errorMessageLabel.text = NSLocalizedString("Keychain error while storing credentials.", comment: "Credentials Error")
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
self.errorMessageLabel.text = NSLocalizedString("Invalid email/password combination.", comment: "Credentials Error")
|
||||||
|
}
|
||||||
|
|
||||||
|
case .failure:
|
||||||
|
|
||||||
|
self.errorMessageLabel.text = NSLocalizedString("Network error. Try again later.", comment: "Credentials Error")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -378,12 +378,28 @@
|
|||||||
</constraints>
|
</constraints>
|
||||||
</tableViewCellContentView>
|
</tableViewCellContentView>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" id="VzJ-7V-Jfa">
|
</cells>
|
||||||
<rect key="frame" x="0.0" y="123" width="414" height="44"/>
|
</tableViewSection>
|
||||||
|
<tableViewSection id="yP0-5C-1Dy">
|
||||||
|
<cells>
|
||||||
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" id="oJc-7j-G4v">
|
||||||
|
<rect key="frame" x="0.0" y="159" width="414" height="44"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="VzJ-7V-Jfa" id="GyY-75-Dmv">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="oJc-7j-G4v" id="mV2-iL-ltS">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="414" height="43.5"/>
|
<rect key="frame" x="0.0" y="0.0" width="414" height="43.5"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Delete Account" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="OKd-Ps-a1K">
|
||||||
|
<rect key="frame" x="148" y="11.5" width="118" height="21"/>
|
||||||
|
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
|
||||||
|
<color key="textColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
|
<nil key="highlightedColor"/>
|
||||||
|
</label>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="OKd-Ps-a1K" firstAttribute="centerY" secondItem="mV2-iL-ltS" secondAttribute="centerY" id="ix2-SF-I7U"/>
|
||||||
|
<constraint firstItem="OKd-Ps-a1K" firstAttribute="centerX" secondItem="mV2-iL-ltS" secondAttribute="centerX" id="nZf-Eh-VXu"/>
|
||||||
|
</constraints>
|
||||||
</tableViewCellContentView>
|
</tableViewCellContentView>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
</cells>
|
</cells>
|
||||||
@ -425,7 +441,7 @@
|
|||||||
<rect key="frame" x="90.5" y="4" width="233" height="46.5"/>
|
<rect key="frame" x="90.5" y="4" width="233" height="46.5"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="accountLocal" translatesAutoresizingMaskIntoConstraints="NO" id="tb2-dO-AhR">
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="accountLocal" translatesAutoresizingMaskIntoConstraints="NO" id="tb2-dO-AhR">
|
||||||
<rect key="frame" x="0.0" y="7.5" width="32" height="32"/>
|
<rect key="frame" x="0.0" y="7.5" width="32" height="32.000000000000028"/>
|
||||||
<color key="tintColor" white="0.33333333333333331" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="tintColor" white="0.33333333333333331" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="height" constant="32" id="0GF-vU-aEc"/>
|
<constraint firstAttribute="height" constant="32" id="0GF-vU-aEc"/>
|
||||||
@ -509,14 +525,14 @@
|
|||||||
<rect key="frame" x="90.5" y="108" width="233" height="36"/>
|
<rect key="frame" x="90.5" y="108" width="233" height="36"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="accountLocal" translatesAutoresizingMaskIntoConstraints="NO" id="74E-kl-vU9">
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="accountLocal" translatesAutoresizingMaskIntoConstraints="NO" id="74E-kl-vU9">
|
||||||
<rect key="frame" x="0.0" y="2" width="32" height="32"/>
|
<rect key="frame" x="0.0" y="2" width="32" height="32.000000000000028"/>
|
||||||
<color key="tintColor" white="0.33333333329999998" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="tintColor" white="0.33333333329999998" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="width" constant="32" id="E7T-ps-KgX"/>
|
<constraint firstAttribute="width" constant="32" id="E7T-ps-KgX"/>
|
||||||
<constraint firstAttribute="height" constant="32" id="hew-64-pi8"/>
|
<constraint firstAttribute="height" constant="32" id="hew-64-pi8"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
</imageView>
|
</imageView>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="On My iPhone" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Tdm-Ge-uc6">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="On My iPhone" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Tdm-Ge-uc6">
|
||||||
<rect key="frame" x="52" y="0.0" width="181" height="36"/>
|
<rect key="frame" x="52" y="0.0" width="181" height="36"/>
|
||||||
<fontDescription key="fontDescription" style="UICTFontTextStyleTitle0"/>
|
<fontDescription key="fontDescription" style="UICTFontTextStyleTitle0"/>
|
||||||
<nil key="textColor"/>
|
<nil key="textColor"/>
|
||||||
@ -524,13 +540,13 @@
|
|||||||
</label>
|
</label>
|
||||||
</subviews>
|
</subviews>
|
||||||
</stackView>
|
</stackView>
|
||||||
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Name" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="2dx-hK-hxL">
|
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Name" textAlignment="natural" adjustsFontForContentSizeCategory="YES" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="2dx-hK-hxL">
|
||||||
<rect key="frame" x="107" y="160" width="200" height="30"/>
|
<rect key="frame" x="107" y="160" width="200" height="30"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="width" constant="200" id="uYr-DR-Oil"/>
|
<constraint firstAttribute="width" constant="200" id="uYr-DR-Oil"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
<nil key="textColor"/>
|
<nil key="textColor"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
|
||||||
<textInputTraits key="textInputTraits"/>
|
<textInputTraits key="textInputTraits"/>
|
||||||
</textField>
|
</textField>
|
||||||
</subviews>
|
</subviews>
|
||||||
@ -564,6 +580,127 @@
|
|||||||
<point key="canvasLocation" x="3214" y="145"/>
|
<point key="canvasLocation" x="3214" y="145"/>
|
||||||
</scene>
|
</scene>
|
||||||
<!--Navigation Controller-->
|
<!--Navigation Controller-->
|
||||||
|
<scene sceneID="qOt-Py-TKw">
|
||||||
|
<objects>
|
||||||
|
<navigationController storyboardIdentifier="FeedbinAccountNavigationViewController" id="AGX-Ph-lE3" sceneMemberID="viewController">
|
||||||
|
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="fpp-8U-JGs">
|
||||||
|
<rect key="frame" x="0.0" y="44" width="414" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
</navigationBar>
|
||||||
|
<connections>
|
||||||
|
<segue destination="byh-sg-6p5" kind="relationship" relationship="rootViewController" id="u92-3E-dIA"/>
|
||||||
|
</connections>
|
||||||
|
</navigationController>
|
||||||
|
<placeholder placeholderIdentifier="IBFirstResponder" id="ieC-Y8-e5K" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||||
|
</objects>
|
||||||
|
<point key="canvasLocation" x="3919" y="145"/>
|
||||||
|
</scene>
|
||||||
|
<!--Feedbin Account View Controller-->
|
||||||
|
<scene sceneID="sCm-Gd-byr">
|
||||||
|
<objects>
|
||||||
|
<viewController storyboardIdentifier="FeedbinAccountViewController" id="byh-sg-6p5" customClass="FeedbinAccountViewController" customModule="NetNewsWire" customModuleProvider="target" sceneMemberID="viewController">
|
||||||
|
<view key="view" contentMode="scaleToFill" id="E6e-jd-9b6">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
|
<subviews>
|
||||||
|
<stackView opaque="NO" contentMode="scaleToFill" alignment="center" spacing="20" translatesAutoresizingMaskIntoConstraints="NO" id="vFL-2i-eRz">
|
||||||
|
<rect key="frame" x="129" y="108" width="156" height="36"/>
|
||||||
|
<subviews>
|
||||||
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="accountFeedbin" translatesAutoresizingMaskIntoConstraints="NO" id="9ht-ce-lQp">
|
||||||
|
<rect key="frame" x="0.0" y="2" width="32" height="32"/>
|
||||||
|
<color key="tintColor" white="0.33333333329999998" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="width" constant="32" id="2Qp-v5-g0U"/>
|
||||||
|
<constraint firstAttribute="height" constant="32" id="aCm-eQ-zWU"/>
|
||||||
|
</constraints>
|
||||||
|
</imageView>
|
||||||
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Feedbin" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hw9-yb-i0u">
|
||||||
|
<rect key="frame" x="52" y="0.0" width="104" height="36"/>
|
||||||
|
<fontDescription key="fontDescription" style="UICTFontTextStyleTitle0"/>
|
||||||
|
<nil key="textColor"/>
|
||||||
|
<nil key="highlightedColor"/>
|
||||||
|
</label>
|
||||||
|
</subviews>
|
||||||
|
</stackView>
|
||||||
|
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Email" textAlignment="natural" adjustsFontForContentSizeCategory="YES" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="UiV-th-dQb">
|
||||||
|
<rect key="frame" x="107" y="160" width="200" height="30"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="width" constant="200" id="ULv-Nf-M1O"/>
|
||||||
|
</constraints>
|
||||||
|
<nil key="textColor"/>
|
||||||
|
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
|
||||||
|
<textInputTraits key="textInputTraits" keyboardType="emailAddress" textContentType="email"/>
|
||||||
|
</textField>
|
||||||
|
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Password" textAlignment="natural" adjustsFontForContentSizeCategory="YES" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="lDh-Kk-Kem">
|
||||||
|
<rect key="frame" x="107" y="198" width="200" height="30"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="width" constant="200" id="vMu-uR-0vC"/>
|
||||||
|
</constraints>
|
||||||
|
<nil key="textColor"/>
|
||||||
|
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
|
||||||
|
<textInputTraits key="textInputTraits" secureTextEntry="YES" textContentType="password"/>
|
||||||
|
</textField>
|
||||||
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9QD-Wz-fqW">
|
||||||
|
<rect key="frame" x="207" y="244" width="0.0" height="0.0"/>
|
||||||
|
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
|
||||||
|
<nil key="textColor"/>
|
||||||
|
<nil key="highlightedColor"/>
|
||||||
|
</label>
|
||||||
|
</subviews>
|
||||||
|
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="UiV-th-dQb" firstAttribute="top" secondItem="vFL-2i-eRz" secondAttribute="bottom" constant="16" id="BUG-5p-BDh"/>
|
||||||
|
<constraint firstItem="lDh-Kk-Kem" firstAttribute="top" secondItem="UiV-th-dQb" secondAttribute="bottom" constant="8" id="N81-px-3YV"/>
|
||||||
|
<constraint firstItem="9QD-Wz-fqW" firstAttribute="centerX" secondItem="E6e-jd-9b6" secondAttribute="centerX" id="Sgr-tG-nT2"/>
|
||||||
|
<constraint firstItem="vFL-2i-eRz" firstAttribute="top" secondItem="4Rm-PZ-VHc" secondAttribute="top" constant="20" id="khS-vK-fL0"/>
|
||||||
|
<constraint firstItem="vFL-2i-eRz" firstAttribute="centerX" secondItem="E6e-jd-9b6" secondAttribute="centerX" id="qew-4G-xhG"/>
|
||||||
|
<constraint firstItem="9QD-Wz-fqW" firstAttribute="top" secondItem="lDh-Kk-Kem" secondAttribute="bottom" constant="16" id="u49-x7-qrR"/>
|
||||||
|
<constraint firstItem="UiV-th-dQb" firstAttribute="centerX" secondItem="E6e-jd-9b6" secondAttribute="centerX" id="vLa-hN-GpR"/>
|
||||||
|
<constraint firstItem="lDh-Kk-Kem" firstAttribute="centerX" secondItem="E6e-jd-9b6" secondAttribute="centerX" id="zjW-9v-aqJ"/>
|
||||||
|
</constraints>
|
||||||
|
<viewLayoutGuide key="safeArea" id="4Rm-PZ-VHc"/>
|
||||||
|
</view>
|
||||||
|
<navigationItem key="navigationItem" id="BFN-hJ-pWd">
|
||||||
|
<barButtonItem key="leftBarButtonItem" systemItem="cancel" id="hLE-sO-Oak">
|
||||||
|
<connections>
|
||||||
|
<action selector="cancel:" destination="byh-sg-6p5" id="Ghd-hv-96w"/>
|
||||||
|
</connections>
|
||||||
|
</barButtonItem>
|
||||||
|
<rightBarButtonItems>
|
||||||
|
<barButtonItem systemItem="done" id="2cL-39-uWX">
|
||||||
|
<connections>
|
||||||
|
<action selector="done:" destination="byh-sg-6p5" id="p1d-pI-ioe"/>
|
||||||
|
</connections>
|
||||||
|
</barButtonItem>
|
||||||
|
<barButtonItem style="plain" id="L90-ti-E7I">
|
||||||
|
<view key="customView" contentMode="scaleToFill" id="xpt-lr-f2h">
|
||||||
|
<rect key="frame" x="325.5" y="12" width="20" height="20"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
|
<subviews>
|
||||||
|
<activityIndicatorView hidden="YES" opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" fixedFrame="YES" style="gray" translatesAutoresizingMaskIntoConstraints="NO" id="Pl1-lc-sIl">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="20" height="20"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
|
</activityIndicatorView>
|
||||||
|
</subviews>
|
||||||
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
</view>
|
||||||
|
</barButtonItem>
|
||||||
|
</rightBarButtonItems>
|
||||||
|
</navigationItem>
|
||||||
|
<connections>
|
||||||
|
<outlet property="activityIndicator" destination="Pl1-lc-sIl" id="hqg-mX-Yns"/>
|
||||||
|
<outlet property="cancelBarButtonItem" destination="hLE-sO-Oak" id="hdM-yd-oDT"/>
|
||||||
|
<outlet property="doneBarButtonItem" destination="2cL-39-uWX" id="wUU-LS-5k8"/>
|
||||||
|
<outlet property="emailTextField" destination="UiV-th-dQb" id="fCb-hg-AXa"/>
|
||||||
|
<outlet property="errorMessageLabel" destination="9QD-Wz-fqW" id="Kjo-73-Pgh"/>
|
||||||
|
<outlet property="passwordTextField" destination="lDh-Kk-Kem" id="ew7-Ej-UpK"/>
|
||||||
|
</connections>
|
||||||
|
</viewController>
|
||||||
|
<placeholder placeholderIdentifier="IBFirstResponder" id="l5n-Op-NE2" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||||
|
</objects>
|
||||||
|
<point key="canvasLocation" x="4642" y="144"/>
|
||||||
|
</scene>
|
||||||
|
<!--Navigation Controller-->
|
||||||
<scene sceneID="ncU-rc-RwA">
|
<scene sceneID="ncU-rc-RwA">
|
||||||
<objects>
|
<objects>
|
||||||
<navigationController storyboardIdentifier="AddLocalAccountNavigationViewController" id="GGt-T1-ndB" sceneMemberID="viewController">
|
<navigationController storyboardIdentifier="AddLocalAccountNavigationViewController" id="GGt-T1-ndB" sceneMemberID="viewController">
|
||||||
|
Loading…
x
Reference in New Issue
Block a user