【问题标题】:Can i use same array variable to store image and video?我可以使用相同的数组变量来存储图像和视频吗?
【发布时间】:2021-07-07 06:00:35
【问题描述】:

我想使用 uiimagepickercontroller 从相册中获取图像和视频,然后显示在 tableview 单元格上。

在tableview单元格上显示图像和视频的步骤如下,

  1. 点击用户界面上的照片按钮
  2. 图库打开并从图库中选择照片,然后将其保存到 array1
  3. 显示在表格视图的第一个单元格上
  4. 再次点击视频按钮
  5. 图库打开并从图库中选择视频,然后将其保存到 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


【解决方案1】:

除了使用上述建议的structAnyObject 类型。您可以创建一个带有关联值的 enum 数组:

enum MediaType {
  case image(_: UIImage)
  case video(_: AVAsset)
}
var dataSource: [MediaType] = []

/// add data
dataSource.append(.image(imageData))
dataSource.append(.video(videoData))

// in cellForRowAt

switch item {
  case image(let image):
  // display image
  case video(let video):
 // display video
}

【讨论】:

  • 我已经使用了postImageVideoCell.configure(postCellArray[indexPath.row] as! String). <br/> func configure(_ videoUrl: String) { guard let url = URL(string: videoUrl) else { return } self.url = url playerView.prepareToPlay(withUrl: url, shouldPlayImmediately: false) }这一行代码
【解决方案2】:

简短回答:是的

长答案:

swift 中的数组没有任何类型,除非您将它们明确指定为某些类型对象的集合。

你可以做一些像这样奇怪的事情,它仍然是可能的。

let image = UIImage()
let video = AVAsset()

var array = [image, video]

或将数组声明为AnyObject的集合

var array = [AnyObject]()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 2020-10-15
    • 1970-01-01
    相关资源
    最近更新 更多