2016-11-14 3 views
0

У меня есть приложение CoreData с довольно длинным списком полей данных. Когда пользователь редактирует поля, но пытается выйти из DetailViewController без сохранения изменений, я вызываю предупреждение, если они действительно хотят отменить изменения. Это прекрасно работает, но если пользователь удаляет домашний ключ, изменения теряются. Я попытался представить предупреждение перед тем, как приложение войдет в фоновый режим, но не смогли задержать вход в фоновый режим, чтобы позволить пользователю вводить данные. Возможно ли задержать запись приложения в фоновом режиме во время ожидания ввода пользователя?Разрешить ввод пользователя перед тем, как приложение вводит фон

Вот что я пробовал:

func applicationWillResignActive(_ notification : Notification) { 
    //this does not work - alert is too late 
    cancelUnsavedEdits() 
    //try above 
}//applicationWillResignActive 

Метод canelUnsavedEdits довольно прямо вперед:

func cancelUnsavedEdits() { 

    if hasChanged { 

     let ac = UIAlertController(title: nil, message: nil, preferredStyle: .alert) 
     ac.addAction(UIAlertAction(title: "Delete Edits", style: .default, handler: { (action : UIAlertAction!) -> Void in 

      self.codeDismissTheKeyboard() 
      self.performSegue(withIdentifier: "unwindToMasterViewController", sender: self) 

      let editRecordButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.edit, target: self, action: #selector(DetailViewController.editThisRecord)) 
      self.navigationItem.rightBarButtonItem = editRecordButton 

      self.navigationItem.leftBarButtonItem = nil 
      self.navigationItem.hidesBackButton = false 

      //need to remove the edits - refresh the original page 
      self.configureView() 

     }))//addAction block 

     ac.addAction(UIAlertAction(title: "Save Edits", style: .default, handler: { (action : UIAlertAction!) -> Void in 

      self.codeDismissTheKeyboard() 
      self.saveTheEditedRecord() 
      self.performSegue(withIdentifier: "unwindToMasterViewController", sender: self) 

     }))//addAction block 

     //for -ipad add code in handler to reopen the fields for editing if the cancel of the cancel is chosed 
     ac.addAction(UIAlertAction(title: "Cancel", style: .default, handler: { (whatever) in 
      //print("makeEntryFieldsEnabledYES for ipad") 
      self.makeEntryFieldsEnabledYES() 
     })) 
     //above for ipad 

     self.present(ac, animated: true, completion: nil) 

    } else { 
     self.codeDismissTheKeyboard() 

     //add this for ipad 
     self.navigationItem.rightBarButtonItem = nil 
     //add above for ipad 

     self.performSegue(withIdentifier: "unwindToMasterViewController", sender: self) 
    }//if hasChanged 

    //this for ipad 
    navigationItem.leftBarButtonItem = nil 
    //above for iPad 

}//cancelUnsavedEdits 

Любое руководство по стратегии достижения этой идеи будут оценены. iOS 10, Xcode 8.1

+0

Возможный дубликат [предупреждение кнопки домашней кнопки iOS, возможно ли это?] (Http://stackoverflow.com/questions/7112723/ios-home-button-warning-is-it-possible) –

+0

Не могли бы вы изменить, где вы сбросить поля редактирования? Хотя имеет смысл выдвинуть «Вы уверены?» при выходе из экрана подробного просмотра также имеет смысл возвращать пользователя на тот же самый экран с подробным представлением точки с полями, как они были, - после нажатия кнопки «домой». – dfd

ответ

3

№ Невозможно.

iOS дает вашему приложению некоторое время для очистки или сохранения данных, но недостаточно времени для взаимодействия с пользователем. Причиной является то, что пользовательский DID взаимодействует и хочет выйти из вашего приложения. Возможно, сохраните введенные пользователем данные и представите их, когда они вернутся, но не пытайтесь предотвратить выход пользователя из системы.

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