【问题标题】:Perform UIDocumentPickerView in a TableViewCell在 TableViewCell 中执行 UIDocumentPickerView
【发布时间】:2021-11-16 17:48:23
【问题描述】:

我正在尝试打开选择器文件菜单。 为此,我创建了一个这样的类:

class pickerView: UIDocumentPickerViewController, UIDocumentPickerDelegate, LTHM_Pickerable {

func importTapped() {
    //Create a picker specifying file type and mode
    let documentPicker = UIDocumentPickerViewController(documentTypes: [String(kUTTypePNG)], in: .import)
    documentPicker.delegate = self
    documentPicker.allowsMultipleSelection = false
    documentPicker.modalPresentationStyle = .fullScreen
    present(documentPicker, animated: true, completion: nil)
}

public func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
    guard controller.documentPickerMode == .import, let url = urls.first, let image = UIImage(contentsOfFile: url.path) else { return }
    
    controller.dismiss(animated: true)
}

public func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) {
    controller.dismiss(animated: true)
}

}

我想在从 UITableViewCell 继承的类中调用函数“importTapped”。

class LTHM_Sticker_Cell: UITableViewCell {
     @IBAction func createStickerOnTAp(_ sender: UIButton, forEvent event: UIEvent) {
         //CALL IMPORTTAPPED HERE
     }
}

你能帮帮我吗?我已经尝试过使用协议,但我不确定......

【问题讨论】:

    标签: swift uikit tableview


    【解决方案1】:

    拥有一个创建常规UIDocumentPickerViewController 实例的UIDocumentPickerViewController 子类有点令人困惑,而且它缺少一个明确的方法来实际呈现它。您可能想试试这个协议/委托解决方案:

    定义协议

    protocol PickerPresenter: UIViewController {
        func presentPicker()
    }
    

    创建将包含您的表格视图的视图控制器类

    class MyViewController: UIViewController  {
       // your implementation
    }
    

    使您的视图控制器符合协议

    extension MyViewController: PickerPresenter {
        
        func presentPicker() {
            let documentPicker = UIDocumentPickerViewController(documentTypes: [String(kUTTypePNG)], in: .import)
            documentPicker.delegate = self
            documentPicker.allowsMultipleSelection = false
            documentPicker.modalPresentationStyle = .fullScreen
            present(documentPicker, animated: true, completion: nil)
        }
    }
    

    并成为选择器代表

    extension MyViewController: UIDocumentPickerDelegate {
    
        public func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
            guard controller.documentPickerMode == .import, let url = urls.first, let image = UIImage(contentsOfFile: url.path) else { return }
            // do something with the selected image
            controller.dismiss(animated: true)
        }
    
        public func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) {
            controller.dismiss(animated: true)
        }
    }
    

    将单元格出列时传递对视图控制器的引用

    extension MyViewController: UITableViewDataSource {
        
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "myCell") as! LTHM_Sticker_Cell
            cell.delegate = self
            return cell
        }
    }
    

    最后,你的 cell 类对委托有一个弱引用,并在点击按钮时调用它的委托方法

    class LTHM_Sticker_Cell: UITableViewCell {
        
        weak var delegate: PickerPresenter?
        
        @IBAction func createStickerOnTAp(_ sender: UIButton, forEvent event: UIEvent) {
            delegate?.presentPicker()
        }
    }
    

    【讨论】:

    • 非常感谢!这真的帮助我理解:)
    • 谢谢@JulietteDestang,如果你愿意,请点赞或标记为答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多