![](/img/trans.png)
[英]How to Dismiss Presenting View Controller when “Ok” Action Tapped in UIAlertController
[英]How do I dismiss a UIAlertController when the return key is tapped in Swift?
我有一个带有两个按钮和一个文本字段的UIAlertController。 轻按保存按钮时,将执行搜索。 我还在textFieldShouldReturn
设置了返回键来执行此操作。 但是,当轻按返回键时,警报控制器不会关闭。 它向上移动到视图的左上角,并导致动画在返回视图时挂起。 我还尝试使用myAlertController.dismiss(animated: false, completion: nil)
消除警报控制器,但这会引发“试图在视图不在窗口层次结构中的UIAlertController上呈现UINavigationController”错误。 轻按返回键并仍然执行segue时,如何关闭警报控制器? 谢谢。
import UIKit
import CoreData
var albumNameFromTextfield: String = ""
class AlbumViewController: UIViewController, UITextFieldDelegate {
// MARK: - Properties
@IBOutlet weak var albumCollectionView: UICollectionView!
@IBOutlet weak var noAlbumsView: UIView!
var albums: [NSManagedObject] = []
let newAlbumAlert = UIAlertController(title: "Create New Album", message: "Enter a name for your new album.", preferredStyle: UIAlertControllerStyle.alert)
// MARK: - Actions
@IBAction func unwindToAlbumsScreen(sender: UIStoryboardSegue) {
}
@IBAction func newAlbumTapped(_ sender: UIBarButtonItem) {
createNewAlbum()
}
func createNewAlbum() {
let nAA = newAlbumAlert
present(nAA, animated: true, completion: nil)
}
// Alert controller setup
func createNewAlbumAlert() {
let saveAction = UIAlertAction(title: "Save", style: .default, handler: { (action) in
guard let textField = self.newAlbumAlert.textFields?[0],
let nameToSave = textField.text else {
return
}
print("Album name has been inputted; save button tapped.")
self.save(name: nameToSave)
self.albumCollectionView.reloadData()
self.performSegue(withIdentifier: "showNewAlbumViewController", sender: self)
})
newAlbumAlert.addTextField{ (textField: UITextField) in
textField.placeholder = "Album Name"
textField.keyboardType = .default
textField.autocorrectionType = .default
textField.returnKeyType = .done
textField.delegate = self
textField.enablesReturnKeyAutomatically = true
}
newAlbumAlert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
newAlbumAlert.addAction(saveAction)
}
//Text field functions
func textFieldDidBeginEditing(_ textField: UITextField) {
self.newAlbumAlert.actions[1].isEnabled = false
textField.text = ""
}
func textFieldDidEndEditing(_ textField: UITextField) {
albumNameFromTextfield = textField.text!
print("Album name for nav title set.")
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
let TFNameToSave = textField.text
self.save(name: TFNameToSave!)
self.albumCollectionView.reloadData()
textField.resignFirstResponder()
self.performSegue(withIdentifier: "segueForTF", sender: self)
print("Album name has been inputted; return button tapped.")
return true
}
@objc func editingChanged(_ textField: UITextField) {
if textField.text?.count == 1 {
if textField.text?.first == " " {
textField.text = ""
return
}
}
guard
let alertControllerText = newAlbumAlert.textFields![0].text, !alertControllerText.isEmpty
else {
newAlbumAlert.actions[1].isEnabled = false
return
}
newAlbumAlert.actions[1].isEnabled = true
}
// ViewDidLoad and ViewWillAppear
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
//Core Date functions
guard let appDelegate =
UIApplication.shared.delegate as? AppDelegate else {
return
}
let managedContext =
appDelegate.persistentContainer.viewContext
let fetchRequest =
NSFetchRequest<NSManagedObject>(entityName: "Album")
do {
albums = try managedContext.fetch(fetchRequest)
} catch let error as NSError {
print("Could not fetch. \(error), \(error.userInfo)")
}
//Setup to do when the view will appear
self.albumCollectionView.reloadData()
if albums.count == 0 {
noAlbumsView.alpha = 1
} else {
noAlbumsView.alpha = 0
}
}
override func viewDidLoad() {
super.viewDidLoad()
createNewAlbumAlert()
newAlbumAlert.textFields![0].addTarget(self, action: #selector(editingChanged), for: .editingChanged)
}
//Core Data functions
func save(name: String) {
guard let appDelegate =
UIApplication.shared.delegate as? AppDelegate else {
return
}
let managedContext =
appDelegate.persistentContainer.viewContext
let entity =
NSEntityDescription.entity(forEntityName: "Album",
in: managedContext)!
let albumName = NSManagedObject(entity: entity,
insertInto: managedContext)
albumName.setValue(name, forKeyPath: "albumName")
do {
try managedContext.save()
albums.append(albumName)
} catch let error as NSError {
print("Could not save. \(error), \(error.userInfo)")
}
}
}
而不是调用的dismiss
上myAlertController
,尝试调用dismiss
你的AlbumViewController
。 我在下面编辑了您的textFieldShouldReturn
函数:
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
let TFNameToSave = textField.text
self.save(name: TFNameToSave!)
self.albumCollectionView.reloadData()
textField.resignFirstResponder()
// ViewController should dismiss the alert controller
dismiss(animated: true) {
self.performSegue(withIdentifier: "segueForTF", sender: self)
print("Album name has been inputted; return button tapped.")
}
return true
}
从文档 :
呈现视图控制器负责解散其呈现的视图控制器。
在这里, 呈现的视图控制器应该是AlbumViewController
, 呈现的是myAlertController
。
希望有效!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.