【问题标题】:How to present a new screen without a UIViewController in Swift 4?如何在 Swift 4 中显示没有 UIViewController 的新屏幕?
【发布时间】:2020-05-06 07:52:03
【问题描述】:

我还没有实现 UIViewController 因为我已经从另一个类继承了,它给出的错误是 present is not a member of this class

func shareAppLink() {           
    let name = "http://aijaz.com"
    let items = [name] as [Any]

    let ac = UIActivityViewController(activityItems: items, applicationActivities: nil)
    present(ac, animated: true)     
}

【问题讨论】:

  • 错误是什么?
  • 错误:使用未解析的标识符“存在”。选择单元格时,我想在我的 UITableView 中显示共享菜单。
  • 从哪里调用shareAppLink()
  • 在UITableView的didSelectRowAt函数中调用。这不是问题,它实际上调用的地方是如何显示共享按钮,因为在我的课堂上现在不是我正在使用的课堂的一部分。我们如何在没有 UIActivityController 的情况下使用 present 方法。
  • 据我了解,您的shareAppLink() 函数有一个单独的类。您可以从didSelectRowAt 调用它。你有没有在shareAppLink()函数类的顶部添加import UIKit?你可以尝试做self.present

标签: ios swift swift3


【解决方案1】:

present(_:animated:completion:)UIViewController的一个方法,所以它必须在UIViewController的某种类型上调用。

如果您的类最初是由视图控制器创建的,那么您可以尝试使用 delegation pattern 传递引用:

委托是一种简单而强大的模式,其中一个对象在一个 程序代表另一个对象或与另一个对象协调。 委托对象保持对另一个对象的引用—— 委托——并在适当的时候向它发送消息。这 消息通知委托对象委托的事件是 即将处理或刚刚处理。

如果您为自定义类创建了一个协议,如下所示:

protocol MyClassDelegate {
    func shareAppLink()
}

然后你可以在你的 View Controller 中遵循该协议并像这样调用该方法:delegate.shareAppLink()

【讨论】:

    【解决方案2】:

    你也可以使用 Respoder Chain 来获取一个视图的父视图控制器

    extension UIView {
        var parentViewController: UIViewController? {
            var parentResponder: UIResponder? = self
            while parentResponder != nil {
                parentResponder = parentResponder!.next
                if let viewController = parentResponder as? UIViewController {
                    return viewController
                }
            }
            return nil
        }
    }
    

    并声明您的 shareAppLink 函数,如

    func shareAppLink(sender : UIView) {
        let name = "http://aijaz.com"
        let items = [name] as [Any]
        let ac = UIActivityViewController(activityItems: items, applicationActivities: nil)
        sender.parentViewController(ac, animated: true)
    }
    

    那么在didSelectRowAt中,可以这样称呼:

    self.shareAppLink(sender : cell)
    

    【讨论】:

      【解决方案3】:

      你必须继承 UIViewController 子类或 UIViewController 类。通过这样做,一个错误应该得到解决。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-11
        • 2012-06-06
        • 1970-01-01
        • 2012-07-23
        • 1970-01-01
        • 1970-01-01
        • 2018-10-20
        相关资源
        最近更新 更多