当我遇到这个问题时,我一直在阅读Big Nerd Ranch的iOS编程并完成第15章关于相机的工作。 只有按住相机按钮,相机才会弹出。我在我的takePicture函数中添加了一个断点,并注意到点击甚至没有调用函数,而是持有。两个代表都包含在我的控制器中,所以这不应该是一个问题。按钮是一个UIBarButtonItem,连接到我的控制器上的takePicture函数。
import UIKit
class DetailViewController: UIViewController, UITextFieldDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
@IBOutlet var nameField: CustomTextField!
@IBOutlet var serialNumberField: CustomTextField!
@IBOutlet var valueField: CustomTextField!
@IBOutlet var dateLabel: UILabel!
@IBOutlet var imageView: UIImageView!
@IBAction func backgroundTapped(_ sender: UITapGestureRecognizer) {
view.endEditing(true)
}
@IBAction func takePicture(_ sender: UIBarButtonItem) {
let imagePicker = UIImagePickerController()
// If the device has a camera, take a picture; otherwise, just pic from photo library
if UIImagePickerController.isSourceTypeAvailable(.camera) {
imagePicker.sourceType = .camera
} else {
imagePicker.sourceType = .photoLibrary
}
imagePicker.delegate = self
// Place image picker on the screen
present(imagePicker, animated: true, completion: nil)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
switch segue.identifier {
case "changeDate"?:
let dateCreatedViewController = segue.destination as! DateCreatedViewController
dateCreatedViewController.item = item
default:
preconditionFailure("Unexpected segue identifier.")
}
}
var item: Item! {
didSet {
navigationItem.title = item.name
}
}
let numberFormatter: NumberFormatter = {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.minimumFractionDigits = 2
formatter.maximumFractionDigits = 2
return formatter
}()
let dateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .none
return formatter
}()
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
nameField.text = item.name
serialNumberField.text = item.serialNumber
valueField.text = numberFormatter.string(from: NSNumber(value: item.valueInDollars))
dateLabel.text = dateFormatter.string(from: item.dateCreated)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
// Clear first responder
view.endEditing(true)
// "Save" changes to item
item.name = nameField.text ?? ""
item.serialNumber = serialNumberField.text
if let valueText = valueField.text, let value = numberFormatter.number(from: valueText) {
item.valueInDollars = value.intValue
} else {
item.valueInDollars = 0
}
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
}
还添加了访问相机和库的权限。加载相机需要一段时间吗?怎么回事?
答案 0 :(得分:1)
问题是您的识别器手势事件正在影响您的按钮。 首先要点击按钮。 首先删除viewcontroller中的识别器手势。
并考虑使用viewcontrollers的扩展名,如下所示:
extension UIViewController {
func hideKeyboardWhenTappedAround() {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
func dismissKeyboard() {
view.endEditing(true)
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.hideKeyboardWhenTappedAround()
}
答案 1 :(得分:0)
看起来连接到调试器UIImagePickerController
需要更长时间来初始化,断开设备与调试器的连接,它应该打开得更快。您也可以尝试将开放代码放入:
DispatchQueue.main.async {
}