【问题标题】:How to i fix the "Cannot find 'present' and 'dismiss' in scope" error in swift如何快速修复“在范围内找不到‘存在’和‘解雇’”错误
【发布时间】:2020-09-25 14:59:09
【问题描述】:

我试图让用户选择一个图像并将其设置为那里的个人资料页面上的横幅,但是当我编写我的代码时,我在尝试呈现 imagePicker 时不断收到错误“在范围内找不到'存在'”并且在尝试关闭 imagePicker 时,我还会收到“无法在范围内找到 'dismiss'”

这是我上面的代码:

//this function gets called when the user tapes on the banner to change the image

class ProfileHeader: UICollectionViewCell, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

@objc func handleBannerTapped() {
    let imagePicker = UIImagePickerController()
    imagePicker.delegate = self
    imagePicker.allowsEditing = true
    present(imagePicker, animated: true, completion: nil)
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    guard let bannerPicture = info[UIImagePickerController.InfoKey.editedImage] as? UIImage else {
        imageSelected = true
        return
    }
    imageSelected = true
    profileImage.layer.masksToBounds = true
    profileBanner.setImage(bannerPicture.withRenderingMode(.alwaysOriginal), for: .normal)
    dismiss(animated: true, completion: nil)
}
}

我在我的注册页面中使用了相同的功能,用户可以在其中选择个人资料图片并且它工作正常,所以我很困惑为什么它现在不适用于横幅

【问题讨论】:

  • 代码在哪里?我希望在UIViewController 中。只有UIViewController可以拨打present(_:animated:completion:)
  • 您需要编辑您的问题以显示该代码来自哪个类。包括类声明:例如class myVCClass: UIViewController { <functions> }

标签: swift uiimagepickercontroller


【解决方案1】:

您只能在视图控制器上使用 presentdismiss。但是 ProfileHeader 不是视图控制器。这是一个细胞。

那么视图控制器在哪里?它来自细胞的响应链。所以沿着响应者链向上走,直到你到达视图控制器,然后 presentdismiss 就可以了。

这里有一个实用方法可以帮助你:

extension UIResponder {
    func next<T:UIResponder>(ofType: T.Type) -> T? {
        let r = self.next
        if let r = r as? T ?? r?.next(ofType: T.self) {
            return r
        } else {
            return nil
        }
    }
}

所以现在你可以说:

if let vc = self.next(ofType: UIViewController.self) {
    vc.present(imagePicker, animated: true, completion: nil)
}

等等。


但是,尽管这会导致您的代码编译,甚至看起来可以正常工作,但我认为您的方法完全是错误的:

  • 你一开始就不应该在牢房里做这项工作。
  • 您不应该让单元格告诉视图控制器要呈现/关闭什么。
  • 不要随意修改单元格的内容。
  • 单元格是一个临时的可重用对象,因此您甚至无法真正保证在选择图像后该单元格仍然存在(或仍将占据表格的同一行)。

相反,单元格应该告诉视图控制器,嘿,用户想要选择一张照片,然后退后一步,让视图控制器完成工作。这项工作应该包括修改数据模型(然后重新加载单元格)。

【讨论】:

    猜你喜欢
    • 2020-10-17
    • 2021-07-11
    • 2022-01-21
    • 2018-12-06
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    相关资源
    最近更新 更多