【问题标题】:Closing View Controller from Save Button从保存按钮关闭视图控制器
【发布时间】:2016-07-10 04:39:34
【问题描述】:

我在展开/关闭视图控制器时遇到问题。

我在这个视图控制器中的导航栏有两个按钮。左边是一个“展开/退出”按钮,可以正常工作并关闭当前视图控制器并将用户返回到主设置屏幕。第二个按钮是“保存”按钮,将用户数据提交到NSUserdefaults。两个按钮都按照它们的设计进行。虽然我希望“保存”按钮再做一件事。

我希望导航栏的“保存”按钮继续按其设计保存为数据,但我也希望它“展开/退出”该视图控制器并返回主设置视图控制器,就像“展开/退出”导航栏按钮。

这是我的视图控制器代码。如您所见,我正在从我的“settingSaveEmailAddress”函数中调用“backButtonTapped”函数。我知道正在触发“backButtonTapped”功能,因为“打印”命令正在调试窗口中打印。虽然它正在保存我的数据,但它无法关闭视图控制器并退回到主设置视图控制器。

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")
    }


}

【问题讨论】:

    标签: ios xcode swift swift2 xcode7


    【解决方案1】:

    你可以写:-

    在 Objective-C 中

     [self.navigationController popToRootViewControllerAnimated:YES];
    

    在 Swift 中

     func popToRootViewControllerAnimated(_ animated: Bool) -> [UIViewController]?
    

    如果您的“主要设置”视图控制器是根视图控制器,则在“保存”按钮方法的末尾。

    【讨论】:

    • 感谢您的宝贵时间,不幸的是,这对我不起作用。我确信我错过了一些东西,因为我是 iOS 开发的新手。
    【解决方案2】:

    我创建了这个函数,当我按下“保存”时,我现在得到了预期的功能。

    1. 保存 NSUserDefault 数据
    2. 关闭当前 ViewController 并返回 我的主要设置视图控制器“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")
      }
      }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-27
      • 2012-06-18
      • 2017-01-26
      • 2017-01-06
      • 2014-09-10
      • 2020-10-31
      相关资源
      最近更新 更多