[英]Swift: UIBarButtonItem only calls action to display UIImagePickerController's interface by holding down the button
遇到此問題時,我正在閱讀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
}
}
還添加了訪問相機和庫的權限。 相機加載需要一段時間嗎? 這是怎么回事?
問題在於您的識別器手勢事件正在影響您的按鈕。 首先稱為點擊按鈕。 首先,在您的視圖控制器中刪除識別器手勢。
並考慮為您的ViewController使用擴展,如下所示:
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()
}
看起來好像連接到調試器時, UIImagePickerController
需要更長的時間才能初始化,將設備與調試器斷開連接,並且打開速度應該更快。 您也可以嘗試將打開代碼放入:
DispatchQueue.main.async {
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.