0

我正在尝试打开选择器文件菜单。为此,我创建了一个类,如下所示:

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
     }
}

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

4

1 回答 1

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
    }
}

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

class LTHM_Sticker_Cell: UITableViewCell {
    
    weak var delegate: PickerPresenter?
    
    @IBAction func createStickerOnTAp(_ sender: UIButton, forEvent event: UIEvent) {
        delegate?.presentPicker()
    }
}
于 2021-11-17T16:04:51.560 回答