【问题标题】:How to run imagePicker in tableViewCell如何在 tableViewCell 中运行 imagePicker
【发布时间】:2015-12-05 05:09:02
【问题描述】:

我有一个带有单元格的 tableView。在这个单元格中,我有一个 imageView 和一个覆盖它的按钮。该按钮有一个 IBAction。点击时,该按钮应该会召唤 imagePicker。 IBAction 代码位于单元格子视图中。

@IBAction func MyStatusImageButtonAction(sender: AnyObject) {
    // Select Image
    let imagePicker = UIImagePickerController()
    imagePicker.delegate = self
    imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
    imagePicker.allowsEditing = false
    self.presentViewController(imagePicker, animated: true, completion: nil)

因为这条线,我得到一个错误。

self.presentViewController(imagePicker, animated: true, completion: nil)

错误提示““myCell”类型的值没有成员“presentViewController”。

我是否应该在承载单元的 viewController 中加载 imagePicker,然后以某种方式将其传输到单元?我应该用不同的代码在单元格中加载 imagePicker 吗?我是不是搞错了?

为了清楚起见,我的目标是让用户加载这个 TableViewController,并且只能将图像分配给这个单元格中的 imageView。

谢谢。

【问题讨论】:

    标签: ios swift uitableview uiimagepickercontroller


    【解决方案1】:

    编写一个协议,您的 TableViewController 将为您显示它。

    protocol ImagePickerDelegate {
    
        func pickImage()
    }
    

    在你的牢房里

    var delegate : ImagePickerDelegate?
    
    @IBAction func pickImage(sender: AnyObject) {
    
        delegate?.pickImage()
    }
    

    在你的 tableViewController 中

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    
        let cell = tableView.dequeueReusableCellWithIdentifier("displayImage", forIndexPath: indexPath) as! ImageTableViewCell
    
        cell.delegate = self
    
        return cell
    }
    
    func pickImage() {
    
        let imagePicker = UIImagePickerController()
        imagePicker.delegate = self
        imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
        imagePicker.allowsEditing = false
        self.presentViewController(imagePicker, animated: true, completion: nil)
    }
    
    func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
    
        dismissViewControllerAnimated(true, completion: nil)
    
        var cell = tableView.cellForRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0)) as! ImageTableViewCell
        cell.displayImageView.image = image
    }
    

    希望对您有所帮助。

    【讨论】:

    • 我在让它工作时遇到了问题,但一旦我添加了:class NewUserTweetTableVC: UIViewController, ImagePickerDelegate它工作了
    • 但是表格数据源也需要在 imagepicker 委托内更新,否则在出列可重用单元格上,图像将消失,因为数据源没有图像。
    【解决方案2】:

    只有viewController 可以呈现另一个viewController。所以使用:

    self.view.presentViewController(imagePicker, animated: true, completion: nil)
    

    【讨论】:

      【解决方案3】:

      只需跟进 @truongky 的帖子,更新 Swift 5 的语法。

      正如他正确指出的那样,首先创建一个协议。您可以为您的协议创建一个带有扩展名的新文件。然后插入OP识别的代码:

      protocol ImagePickerDelegate {
          func pickImage() 
      }
      


      然后,在您的 TableViewController 中:

      func pickImage() {
          let imagePicker = UIImagePickerController()
          imagePicker.delegate = self
          imagePicker.sourceType = UIImagePickerController.SourceType.photoLibrary
          imagePicker.allowsEditing = false
          self.present(imagePicker, animated: true, completion: nil)
      }
      
      func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
          if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
              let cell:ImageCell = tableView.cellForRow(at: IndexPath(row: 0, section: 0)) as! ImageCell
              cell.customImage.image = image
          }
      
          picker.dismiss(animated: true, completion: nil)
      }
      


      此外,您可以修改自定义单元格以响应点击手势识别器,如下所示:

      var delegate : ImagePickerDelegate?
      
      @IBOutlet weak var customImage: UIImageView!
      
      override func awakeFromNib() {
          super.awakeFromNib()
          // Initialization code
      
          addTapGestureRecognizer(for: customImage)
      }
      
      override func setSelected(_ selected: Bool, animated: Bool) {
          super.setSelected(selected, animated: animated)
      
          // Configure the view for the selected state
      }
      
      func addTapGestureRecognizer(for view: UIImageView) {
          let tap = UITapGestureRecognizer(target: self, action: #selector(pickImage))
          tap.numberOfTapsRequired = 1
          view.isUserInteractionEnabled = true
          view.addGestureRecognizer(tap)
      }
      
      @objc func pickImage() {
          delegate?.pickImage()
      }
      


      希望这会有所帮助。

      感谢~

      【讨论】:

        【解决方案4】:

        我在这里找到了一个非常全面的逐步答案

        https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson6.html#//apple_ref/doc/uid/TP40015214-CH20-SW1

        从“定义您的数据模型”开始。

        基本上发生的情况是您在 Swift 文件中定义数据。然后在 ViewController 中将照片设置为等于 ImageView。然后仍然在 ViewController 代码中,将新定义的照片指向您的单元格。我一直在错误地解决这个问题。提供的链接非常全面。

        【讨论】:

          猜你喜欢
          • 2019-10-24
          • 2019-10-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-13
          • 2012-01-07
          • 2017-03-27
          • 1970-01-01
          相关资源
          最近更新 更多