【发布时间】:2021-07-07 06:00:35
【问题描述】:
我想使用 uiimagepickercontroller 从相册中获取图像和视频,然后显示在 tableview 单元格上。
在tableview单元格上显示图像和视频的步骤如下,
- 点击用户界面上的照片按钮
- 图库打开并从图库中选择照片,然后将其保存到 array1
- 显示在表格视图的第一个单元格上
- 再次点击视频按钮
- 图库打开并从图库中选择视频,然后将其保存到 array1 6.在tableview的第二个单元格上显示
等等,这些步骤不固定,我们可以点击第一个视频按钮。
注 1; 我正在制作像 Facebook 这样的演示应用程序 用户可以在其中发布图像或视频(但来自相册),并在单元格上显示。 笔记2; 它运行正常,但是当我选择第一个视频然后选择照片时,我在 cellforrowat indexpath 方法中出现错误无法将类型“UIImage”(0x7fff86f38430)的值转换为“NSString”(0x7fff86d97bb0)。部分。
我的代码如下,(仅供参考,为简单起见,我从图库中省略了 avplayer 和视频选择的代码)
import UIKit
class ViewController: UIViewController, UINavigationControllerDelegate {
@IBOutlet weak var imageFromGallery: UIImageView!
@IBOutlet weak var tableview: UITableView!
var postCellArray = [Any]()
var postMediaType : String = ""
let pickerController = UIImagePickerController()
@IBAction func getVideo(_ sender: UIButton) {
getVideosFromGallery()
}
@IBAction func getPhoto(_ sender: UIButton) {
getPhotosFromGallery()
}
override func viewDidLoad() {
super.viewDidLoad()
pickerController.delegate = self
pickerController.allowsEditing = true
}
func getVideosFromGallery(){
if let selectedVideo : URL = info[UIImagePickerController.InfoKey.mediaURL] as? URL {
imagePicker.dismiss(animated: true, completion: nil)
postMediaType = "public.movie"
postCellArray.append(selectedVideo)
DispatchQueue.main.async {
self.postTableView.reloadData()
}
}
func getPhotosFromGallery(){
pickerController.allowsEditing = false
pickerController.sourceType = .photoLibrary
present(pickerController, animated: true, completion: nil)
}
}
extension ViewController : UIImagePickerControllerDelegate{
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let pickedImage = info[UIImagePickerController.InfoKey.editedImage] as? UIImage{
postCellArray.append(pickedImage)
tableview.reloadData()
}
dismiss(animated: true, completion: nil)
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
dismiss(animated: true, completion: nil)
}
}
extension ViewController : UITableViewDataSource{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return postCellArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
if postMediaType == "public.movie"{
postImageVideoCell.addSubview(postImageVideoCell.playerView)
postImageVideoCell.configure(postCellArray[indexPath.row] as! String)
}
else{
//I get error here
postImageVideoCell.userPostImageVideo.image = UIImage(contentsOfFile: (postCellArray[indexPath.row] as! String))
}
return postImageVideoCell
}
func configure(_ videoUrl: String)
{
guard let url = URL(string: videoUrl) else { return }
self.url = url
playerView.prepareToPlay(withUrl: url, shouldPlayImmediately: false)
}
【问题讨论】:
-
可以,但这可能是个坏主意。
-
@JoakimDanielson 这是个坏主意,请告诉我们。
-
因为每次你想从数组中获取一个元素都需要检查它是什么类型。
-
你还有什么办法吗? @JoakimDanielson
-
听着,这是一个非常模糊的问题,没有任何关于您要做什么的详细信息,所以不,我没有任何详细的答案,因为不可能有一个。我只能说我会考虑通过两个数组来分隔对象
标签: ios swift uiimagepickercontroller