Swift - 有没有办法在相机处于活动状态时显示 AlertController?
Swift - Is there a way to present an AlertController while the camera is active?
我正在使用 Swift 3, Xcode 8.2.
我目前有一个应用程序,我可以让用户打开相机拍照。打开相机后,我希望出现一个警告框,为用户提供一些信息。用户可以在控制再次返回到相机之前单击 "Done"。
这是我的代码:
func openCameraAction() {
// Check if the camera is available on the device as a source type
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera) {
// declare a variable of image picker controller
let imagePicker = UIImagePickerController()
// set its delegate, set its source type
imagePicker.delegate = self
imagePicker.sourceType = UIImagePickerControllerSourceType.camera
// tell our image picker to not edit a captured picture
// which means that we won’t get the black screen with
// a square frame right after taking a photo.
imagePicker.allowsEditing = false
// present the camera controller, it will show up from the
// bottom of the screen, which is the default iOS animation
// for opening new screens.
self.present(imagePicker, animated: true, completion: nil)
}
}
func displayInstructions() {
let instructionController = UIAlertController(title: "Photo Instructions", message: "Some instruction here", preferredStyle: .alert)
let actionDone = UIAlertAction(title: "Done", style: .cancel) { (action:UIAlertAction) in
//This is called when the user presses the done button.
print("You've pressed the done button");
}
//Add the buttons
instructionController.addAction(actionDone)
//Present the instruction controller
self.present(instructionController, animated: true, completion: nil)
}
我试过设置 openCameraAction
中的 completion
字段来调用方法 displayInstruction
但很快意识到我不能以嵌套方式呈现内容。我相信礼物必须从根视图控制器级别发生,对吗?
Attempt to present ... on
... whose view is not in the window
hierarchy!
但是,有什么方法可以实现这种效果吗?做一些嵌套的礼物吗?
感谢您的帮助。
编辑
我看了另外一个问题,还是有点懵。我从其他答案中抓取了一段代码,但很难弄清楚如何将其集成到我的代码中。
var rootViewController = UIApplication.shared.keyWindow?.rootViewController
if let navigationController = rootViewController as? UINavigationController {
rootViewController = navigationController.viewControllers.first
}
if let tabBarController = rootViewController as? UITabBarController {
rootViewController = tabBarController.selectedViewController
}
rootViewController?.present(alertController, animated: true, completion: nil)
我是否将上述代码包含在 openCameraAction
或 displayInstruction
函数中?
你应该在 UIImagePickerController
上展示 UIAlertController
。
我修改了你的代码。请参阅下面的代码。
func openCameraAction()
{
// Check if the camera is available on the device as a source type
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera)
{
// declare a variable of image picker controller
let imagePicker = UIImagePickerController()
// set its delegate, set its source type
imagePicker.delegate = self
imagePicker.sourceType = UIImagePickerControllerSourceType.camera
// tell our image picker to not edit a captured picture
// which means that we won’t get the black screen with
// a square frame right after taking a photo.
imagePicker.allowsEditing = false
// present the camera controller, it will show up from the
// bottom of the screen, which is the default iOS animation
// for opening new screens.
self.present(imagePicker, animated: true, completion: {
let instructionController = UIAlertController(title: "Photo Instructions", message: "Some instruction here", preferredStyle: .alert)
let actionDone = UIAlertAction(title: "Done", style: .cancel) {(action:UIAlertAction) in
//This is called when the user presses the done button.
print("You've pressed the done button");
}
//Add the buttons
instructionController.addAction(actionDone)
//Present the instruction controller
imagePicker.present(instructionController, animated: true, completion: nil)
})
}
}
我试过上面的代码。它工作正常。试试吧!
我正在使用 Swift 3, Xcode 8.2.
我目前有一个应用程序,我可以让用户打开相机拍照。打开相机后,我希望出现一个警告框,为用户提供一些信息。用户可以在控制再次返回到相机之前单击 "Done"。
这是我的代码:
func openCameraAction() {
// Check if the camera is available on the device as a source type
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera) {
// declare a variable of image picker controller
let imagePicker = UIImagePickerController()
// set its delegate, set its source type
imagePicker.delegate = self
imagePicker.sourceType = UIImagePickerControllerSourceType.camera
// tell our image picker to not edit a captured picture
// which means that we won’t get the black screen with
// a square frame right after taking a photo.
imagePicker.allowsEditing = false
// present the camera controller, it will show up from the
// bottom of the screen, which is the default iOS animation
// for opening new screens.
self.present(imagePicker, animated: true, completion: nil)
}
}
func displayInstructions() {
let instructionController = UIAlertController(title: "Photo Instructions", message: "Some instruction here", preferredStyle: .alert)
let actionDone = UIAlertAction(title: "Done", style: .cancel) { (action:UIAlertAction) in
//This is called when the user presses the done button.
print("You've pressed the done button");
}
//Add the buttons
instructionController.addAction(actionDone)
//Present the instruction controller
self.present(instructionController, animated: true, completion: nil)
}
我试过设置 openCameraAction
中的 completion
字段来调用方法 displayInstruction
但很快意识到我不能以嵌套方式呈现内容。我相信礼物必须从根视图控制器级别发生,对吗?
Attempt to present ... on ... whose view is not in the window hierarchy!
但是,有什么方法可以实现这种效果吗?做一些嵌套的礼物吗?
感谢您的帮助。
编辑
我看了另外一个问题,还是有点懵。我从其他答案中抓取了一段代码,但很难弄清楚如何将其集成到我的代码中。
var rootViewController = UIApplication.shared.keyWindow?.rootViewController
if let navigationController = rootViewController as? UINavigationController {
rootViewController = navigationController.viewControllers.first
}
if let tabBarController = rootViewController as? UITabBarController {
rootViewController = tabBarController.selectedViewController
}
rootViewController?.present(alertController, animated: true, completion: nil)
我是否将上述代码包含在 openCameraAction
或 displayInstruction
函数中?
你应该在 UIImagePickerController
上展示 UIAlertController
。
我修改了你的代码。请参阅下面的代码。
func openCameraAction()
{
// Check if the camera is available on the device as a source type
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera)
{
// declare a variable of image picker controller
let imagePicker = UIImagePickerController()
// set its delegate, set its source type
imagePicker.delegate = self
imagePicker.sourceType = UIImagePickerControllerSourceType.camera
// tell our image picker to not edit a captured picture
// which means that we won’t get the black screen with
// a square frame right after taking a photo.
imagePicker.allowsEditing = false
// present the camera controller, it will show up from the
// bottom of the screen, which is the default iOS animation
// for opening new screens.
self.present(imagePicker, animated: true, completion: {
let instructionController = UIAlertController(title: "Photo Instructions", message: "Some instruction here", preferredStyle: .alert)
let actionDone = UIAlertAction(title: "Done", style: .cancel) {(action:UIAlertAction) in
//This is called when the user presses the done button.
print("You've pressed the done button");
}
//Add the buttons
instructionController.addAction(actionDone)
//Present the instruction controller
imagePicker.present(instructionController, animated: true, completion: nil)
})
}
}
我试过上面的代码。它工作正常。试试吧!