簡體   English   中英

Swift:UIBarButtonItem僅通過按住按鈕來調用操作以顯示UIImagePickerController的界面

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM