- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个项目,其中有许多使用 imagePicker 的 View Controller 。每次,我都必须再次复制 didFinishPickingMediaWithInfo 并且只更改一些代码。
然后我决定把 UIImagePickerControllerDelegate 和 UINavigationControllerDelegate 包装成我自己的协议(protocol),并扩展这个协议(protocol)来实现 didFinishPickingMediaWithInfo。但是,根本没有调用 didFinishPickingMediaWithInfo。所有其他部分都运行良好,图像拾取器和相机 View 显示良好,但完成拾取后,没有调用 didFinish 函数。
我在网上看到了一些建议,比如这个。他们使用具体类来扭曲这两个协议(protocol),而不是接口(interface)。
https://gist.github.com/rpassis/4622291029cd12e4ce2b7585d3e62d15
我不知道为什么我的解决方案是错误的,有人可以告诉我我的代码错误的原因。也许我误解了协议(protocol)和协议(protocol)扩展的某些部分。顺便说一句,我发现一个警告是
Non-'@objc' method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' does not satisfy optional requirement of '@objc' protocol 'UIImagePickerControllerDelegate'
public protocol ImagePickerDelegate: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
func successActionFromCamera(with localIdentifier: String, picker: UIImagePickerController)
func successActionFromPhotoLibrary(with imageURL: URL, picker: UIImagePickerController)
}
extension ImagePickerDelegate {
public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
//camera
if info[UIImagePickerControllerReferenceURL] == nil {
func savePhotoAndTakeAction() {
var imagePlaceholder:PHObjectPlaceholder!
DispatchQueue.global(qos: .default).async {
PHPhotoLibrary.shared().performChanges({
let request = PHAssetChangeRequest.creationRequestForAsset(from: info[UIImagePickerControllerOriginalImage]! as! UIImage)
imagePlaceholder = request.placeholderForCreatedAsset!
}, completionHandler: { (success, error) -> Void in
DispatchQueue.main.async {
if success {
//image saved to photos library.
self.successActionFromCamera(with: imagePlaceholder.localIdentifier, picker: picker)
} else {
picker.dismiss(animated: true, completion: nil)
print(error!.localizedDescription)
}
picker.dismiss(animated: true, completion: nil)
}
})
}
}
switch PHPhotoLibrary.authorizationStatus() {
case .denied:
picker.dismiss(animated: false) { BasePhotoUtil.showAccessAlertController(false) }
return
case .notDetermined:
PHPhotoLibrary.requestAuthorization({ (newStatus) in
if (newStatus == .authorized) {
savePhotoAndTakeAction()
}
else {
DispatchQueue.main.async {
picker.dismiss(animated: false, completion: { BasePhotoUtil.showAccessAlertController(false) })
}
return
}
})
default:
break
}
savePhotoAndTakeAction()
} else {
//photo library
if let imageURL = info[UIImagePickerControllerReferenceURL] as? URL {
self.successActionFromPhotoLibrary(with: imageURL, picker: picker)
} else {
picker.dismiss(animated: true, completion: nil)
}
}
}
private static func showImagePickerView(isCamera: Bool, currentVC: UIViewController) {
let imagePicker = UIImagePickerController()
imagePicker.delegate = currentVC as? UIImagePickerControllerDelegate & UINavigationControllerDelegate
imagePicker.allowsEditing = false
imagePicker.navigationBar.isTranslucent = false
if isCamera {
if UIImagePickerController.isSourceTypeAvailable(.camera) {
imagePicker.sourceType = .camera
imagePicker.cameraCaptureMode = .photo
} else {
BaseAlertUtil.showNoFunctionAlertController(title: "No Camera", message: "Sorry, this device has no camera")
}
} else {
imagePicker.sourceType = .photoLibrary
}
currentVC.present(imagePicker, animated: true) {
BaseThemeUtil.setStatusBarStyle(.default)
}
}
最佳答案
这个问题是重复的。其实不是ImagePicker问题,更像是协议(protocol)扩展问题。原因是 swift 协议(protocol)不能扩展 objc 协议(protocol)。
我想我已经在我的问题中给出了解决方案和解释。
说明:
关于ios - UIImagePickerControllerDelegate didFinishPickingMediaWithInfo 未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49441953/
我正在开发一个简单的应用程序扫描二维码。为了扫描 QR 码,我使用一种委托(delegate)方法,如下所示。 - (void) imagePickerController: (UIImagePick
我已将 UIImagePickerController 添加到 UIViewController。我还将 UIImagePickerControllerDelegate 分配给了 UIViewCont
所以我有这段代码可以获取我的画廊中的照片或使用相机更改 UIImage。 @IBAction func tappedCamera() { print("tapped camera")
我正在尝试创建一个 Controller 来处理所有图像功能,以便您可以轻松地从任何 View Controller 绑定(bind)所有相机操作。 理想情况下,我的目标是创建一个具有返回 UIIma
我有一个独立的类,可以使用 UIImagePickerController 从相机/照片库中获取图像。 我似乎无法弄清楚为什么没有调用 didFinishPickingMediaWithInfo 或
我在 iPhone 3G 上使用 iOS 4.2.1 中的 UIImagePickerController。我以前使用过弃用的方法 - (void)imagePickerController: did
我遵循了一个很棒的教程( http://iphone.zcentric.com/2008/08/28/using-a-uiimagepickercontroller/ ),使用 UIImagePick
我有一个项目,其中有许多使用 imagePicker 的 View Controller 。每次,我都必须再次复制 didFinishPickingMediaWithInfo 并且只更改一些代码。 然
我最近重构了我的应用程序以实现 命令 图案。为此,我试图将我的所有功能都集成到适当的命令类中。我已经成功地为我的所有命令实现了该模式,但有一个异常(exception)。我有一个名为 HarvestP
这个问题在这里已经有了答案: error: Cannot subscript a value of type '[String : Any]' with an index of type 'UIIm
我有一个类,我在其中调用 UIImagePickerController 来选择一个图像并返回它,这样我就可以在我的代码中的其他地方使用它。 现在我设置了委托(delegate)并实现了我需要的必要函
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera) {
我有一个 iPhone 应用程序,它调用 UIImagePickerController 让人们可以选择通过相机或通过手机上的照片库选择图像。问题是,有时(不能总是让它复制。),本应由 didFini
我正在使用 UIImagePickerController 来选择图像。我也希望获得本地路径。 我正在使用 对相册中的图像执行此操作 info[UIImagePickerController.Info
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我错过了一些东西。这段代码运行良好,但我想清除所有编译器警告。 Sending 'GSBBuilderImageButton *const __strong' to parameter of inco
我有一个应用程序需要拍照然后显示给用户。我使用以下代码打开相机让用户拍照: if ([UIImagePickerController isSourceTypeAvailable: UIImagePic
func openGallery(sender: AnyObject) { var imagePicker = UIImagePickerController() imagePicke
我如何使用更新后的 UIImagePickerControllerDelegate API,因为它更改为 [UIIMagePickerController.InfoKey : Any]?这部分已经更新
我在 Swift 中有一个新的 iOS 应用程序,我试图在应用程序启动后立即显示相机。在我的 View Controller 中,我有一个 UIView 对象,我尝试用相机填充它。 我的 View C
我是一名优秀的程序员,十分优秀!