从保存按钮关闭视图控制器
Closing View Controller from Save Button
我在 Unwinding/Closing 视图控制器中遇到问题。
我在这个视图控制器中的导航栏有两个按钮。左边的是一个 "Unwind/exit" 按钮,可以正常工作并关闭当前视图控制器,并 return 将用户返回到主设置屏幕。第二个按钮是 "Save" 按钮,用于将用户数据提交到 NSUserdefaults
。两个按钮都按照它们的设计进行操作。虽然我希望 "Save" 按钮可以做一件事。
我希望导航栏 "Save" 按钮继续按设计保存为数据,但我也希望它 "Unwind/Exit" 那个视图控制器和 return主设置视图控制器就像 "Unwind/Exit" 导航栏按钮一样。
这是我的视图控制器代码。正如您将看到的,我正在从我的 "settingSaveEmailAddress" 函数中调用 "backButtonTapped" 函数。我知道 "backButtonTapped" 函数正在被触发,因为 "print" 命令正在调试 window 中打印。虽然它正在保存我的数据,但无法关闭视图控制器并返回到主设置视图控制器。
import UIKit
class SettingsViewController: UIViewController {
@IBOutlet weak var settingEmailAddress: UITextField!
@IBOutlet weak var settingEmailAddressLastUpdate: UILabel!
// Constant keys for NSUserDefaults look ups
static let settingDefaultEmailAddress = "EMAIL_ADDRESS"
static let settingDefaultEmailAddressLastUpdated = "EMAIL_ADDRESS_LAST_UPDATED"
//End Setting - Email Address
@IBAction func settingSaveEmailAddress(sender: AnyObject) {
if (settingEmailAddress.text!.characters.count > 0) {
let prefs = NSUserDefaults.standardUserDefaults()
prefs.setObject(settingEmailAddress.text, forKey: SettingsViewController.settingDefaultEmailAddress)
saveTimestampEmailAddress()
}
dismissKeyboard()
print(settingEmailAddress.text)
backButtonTapped(self)
}
//End Setting - Email Address
override func viewDidLoad() {
super.viewDidLoad()
// Uncomment these if you want to clear out the saved defaults
//let appDomain = NSBundle.mainBundle().bundleIdentifier!
//NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(SettingsViewController.dismissKeyboard))
view.addGestureRecognizer(tap)
// update labels from NSUserDefaults
getUserPreferences()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// Updates the view with the user values already stored in NSUserDefaults
func getUserPreferences() {
let prefs = NSUserDefaults.standardUserDefaults()
// Get Email Address
if let email = prefs.stringForKey(SettingsViewController.settingDefaultEmailAddress) {
settingEmailAddress.text = email
}
// Get the last time something was stored
let dateFormatter = NSDateFormatter()
dateFormatter.dateStyle = NSDateFormatterStyle.LongStyle
dateFormatter.timeStyle = .MediumStyle
if let lastUpdateStored = (prefs.objectForKey(SettingsViewController.settingDefaultEmailAddressLastUpdated) as? NSDate) {
settingEmailAddressLastUpdate.text = "Last Update:" + dateFormatter.stringFromDate(lastUpdateStored)
} else {
settingEmailAddressLastUpdate.text = "Last Update: Never"
}
}
// MARK: - Keyboard responders so the keyboard goes away when we're done editing.
// Dismiss the keyboard when the user is finished editing.
func dismissKeyboard(){
// Resign the first responder status.
view.endEditing(true)
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
// Saves the timestamp of when the user has made a change to the NSUserDefaults
func saveTimestampEmailAddress() {
let prefs = NSUserDefaults.standardUserDefaults()
let timestamp = NSDate()
prefs.setObject(timestamp, forKey: SettingsViewController.settingDefaultEmailAddressLastUpdated)
let dateFormatter = NSDateFormatter()
dateFormatter.dateStyle = NSDateFormatterStyle.LongStyle
dateFormatter.timeStyle = .MediumStyle
settingEmailAddressLastUpdate.text = "Last Update:" + dateFormatter.stringFromDate(timestamp)
}
func backButtonTapped(sender: AnyObject) {
self.dismissViewControllerAnimated(true, completion: nil)
print("Exit Triggered")
}
}
你可以这样写:-
In Objective-C
[self.navigationController popToRootViewControllerAnimated:YES];
In Swift
func popToRootViewControllerAnimated(_ animated: Bool) -> [UIViewController]?
如果 "Main Setting" viewController 是根 viewController,则 在 "Save" 按钮方法的末尾。
我创建了这个函数,现在当我按下 "Save" 时我得到了预期的功能。
- 保存 NSUserDefault 数据
关闭当前 ViewController 和 return
我的主要设置视图控制器 "SettingsMainTableViewController".
func closeVCReturnSettings() {
for controller in self.navigationController!.viewControllers as Array {
if controller.isKindOfClass(SettingsMainTableViewController) {
self.navigationController?.popToViewController(controller as UIViewController, animated: true)
break
}
print("Return to settings")
}
}
我在 Unwinding/Closing 视图控制器中遇到问题。
我在这个视图控制器中的导航栏有两个按钮。左边的是一个 "Unwind/exit" 按钮,可以正常工作并关闭当前视图控制器,并 return 将用户返回到主设置屏幕。第二个按钮是 "Save" 按钮,用于将用户数据提交到 NSUserdefaults
。两个按钮都按照它们的设计进行操作。虽然我希望 "Save" 按钮可以做一件事。
我希望导航栏 "Save" 按钮继续按设计保存为数据,但我也希望它 "Unwind/Exit" 那个视图控制器和 return主设置视图控制器就像 "Unwind/Exit" 导航栏按钮一样。
这是我的视图控制器代码。正如您将看到的,我正在从我的 "settingSaveEmailAddress" 函数中调用 "backButtonTapped" 函数。我知道 "backButtonTapped" 函数正在被触发,因为 "print" 命令正在调试 window 中打印。虽然它正在保存我的数据,但无法关闭视图控制器并返回到主设置视图控制器。
import UIKit
class SettingsViewController: UIViewController {
@IBOutlet weak var settingEmailAddress: UITextField!
@IBOutlet weak var settingEmailAddressLastUpdate: UILabel!
// Constant keys for NSUserDefaults look ups
static let settingDefaultEmailAddress = "EMAIL_ADDRESS"
static let settingDefaultEmailAddressLastUpdated = "EMAIL_ADDRESS_LAST_UPDATED"
//End Setting - Email Address
@IBAction func settingSaveEmailAddress(sender: AnyObject) {
if (settingEmailAddress.text!.characters.count > 0) {
let prefs = NSUserDefaults.standardUserDefaults()
prefs.setObject(settingEmailAddress.text, forKey: SettingsViewController.settingDefaultEmailAddress)
saveTimestampEmailAddress()
}
dismissKeyboard()
print(settingEmailAddress.text)
backButtonTapped(self)
}
//End Setting - Email Address
override func viewDidLoad() {
super.viewDidLoad()
// Uncomment these if you want to clear out the saved defaults
//let appDomain = NSBundle.mainBundle().bundleIdentifier!
//NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(SettingsViewController.dismissKeyboard))
view.addGestureRecognizer(tap)
// update labels from NSUserDefaults
getUserPreferences()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// Updates the view with the user values already stored in NSUserDefaults
func getUserPreferences() {
let prefs = NSUserDefaults.standardUserDefaults()
// Get Email Address
if let email = prefs.stringForKey(SettingsViewController.settingDefaultEmailAddress) {
settingEmailAddress.text = email
}
// Get the last time something was stored
let dateFormatter = NSDateFormatter()
dateFormatter.dateStyle = NSDateFormatterStyle.LongStyle
dateFormatter.timeStyle = .MediumStyle
if let lastUpdateStored = (prefs.objectForKey(SettingsViewController.settingDefaultEmailAddressLastUpdated) as? NSDate) {
settingEmailAddressLastUpdate.text = "Last Update:" + dateFormatter.stringFromDate(lastUpdateStored)
} else {
settingEmailAddressLastUpdate.text = "Last Update: Never"
}
}
// MARK: - Keyboard responders so the keyboard goes away when we're done editing.
// Dismiss the keyboard when the user is finished editing.
func dismissKeyboard(){
// Resign the first responder status.
view.endEditing(true)
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
// Saves the timestamp of when the user has made a change to the NSUserDefaults
func saveTimestampEmailAddress() {
let prefs = NSUserDefaults.standardUserDefaults()
let timestamp = NSDate()
prefs.setObject(timestamp, forKey: SettingsViewController.settingDefaultEmailAddressLastUpdated)
let dateFormatter = NSDateFormatter()
dateFormatter.dateStyle = NSDateFormatterStyle.LongStyle
dateFormatter.timeStyle = .MediumStyle
settingEmailAddressLastUpdate.text = "Last Update:" + dateFormatter.stringFromDate(timestamp)
}
func backButtonTapped(sender: AnyObject) {
self.dismissViewControllerAnimated(true, completion: nil)
print("Exit Triggered")
}
}
你可以这样写:-
In Objective-C
[self.navigationController popToRootViewControllerAnimated:YES];
In Swift
func popToRootViewControllerAnimated(_ animated: Bool) -> [UIViewController]?
如果 "Main Setting" viewController 是根 viewController,则 在 "Save" 按钮方法的末尾。
我创建了这个函数,现在当我按下 "Save" 时我得到了预期的功能。
- 保存 NSUserDefault 数据
关闭当前 ViewController 和 return 我的主要设置视图控制器 "SettingsMainTableViewController".
func closeVCReturnSettings() { for controller in self.navigationController!.viewControllers as Array { if controller.isKindOfClass(SettingsMainTableViewController) { self.navigationController?.popToViewController(controller as UIViewController, animated: true) break } print("Return to settings") } }