2016-07-10 2 views
1

У меня проблема с разматыванием/закрытием контроллера просмотра.Закрытие контроллера просмотра из кнопки сохранения

Моя панель навигации в этом виде контроллера имеет две кнопки. Левая кнопка «Unwind/exit», которая отлично работает и закрывает текущий контроллер представления и возвращает пользователя обратно на экран основных настроек. Вторая кнопка - это кнопка «Сохранить», которая фиксирует данные пользователей на NSUserdefaults. Обе кнопки выполняют то, что они предназначены. Хотя я бы хотел, чтобы кнопка «Сохранить» сделала еще одну вещь.

Я бы хотел, чтобы кнопка «Сохранить» на панели навигации продолжала сохранять как данные в соответствии с ее конструированием, но мне также хотелось бы, чтобы «Unwind/Exit» отображал контроллер и возвращался к главному диспетчеру настроек так же, как Кнопка «Разморозка/Выход» на панели навигации.

Вот мой код для контроллера вида. Как вы сможете увидеть, я вызываю функцию «backButtonTapped» из моей функции «settingSaveEmailAddress». Я знаю, что функция «backButtonTapped» запускается, потому что команда «print» печатает в окне отладки. Несмотря на то, что он сохраняет мои данные, он не может закрыть контроллер просмотра и снова вернуться к контроллеру представления основных настроек.

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


} 

ответ

0

Я создал эту функцию, и теперь я получаю ожидаемую функциональность, когда нажимаю «Сохранить».

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

Вы можете написать: -

В Objective-C

[self.navigationController popToRootViewControllerAnimated:YES]; 

В Swift

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

в конце вашего метода кнопок «Сохранить», если ваш «главный параметр» viewController является корневым контроллером viewController.

+0

эй брат, если вы найдете ответ полезным не забудьте витрину это правильно:) – dreamBegin

+0

Спасибо за время, к сожалению, не работает для меня. Я уверен, что пропустил что-то, так как я новичок в разработке iOS. – Bill

Смежные вопросы