首页 > 解决方案 > 窥视和弹出问题

问题描述

我正在 Xcode 9、Swift 4、iOS 11 中构建一个联系人应用程序,但我很难在我的应用程序中实现 Peek and Pop。它应该是这样工作的:在 UITableView 上向用户显示他们的联系人列表。我希望用户能够使用 3D Touch 来查看联系人,而无需打开联系人并在他们希望打开联系人时弹出它。我在Techotopia上找到了一个关于使用 3D Touch 的很棒的教程,但一直无法让它发挥作用。Xcode 没有给我任何错误,但是当我在 iPhone 8 上调试应用程序时,它不起作用。这是我的代码:

func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
    guard let indexPath = tableView.indexPathForRow(at: location),
        let cell = tableView.cellForRow(at: indexPath) else {
            return nil }

    guard let detailViewController =
        storyboard?.instantiateViewController(
            withIdentifier: "InfoContactController") as?
        InfoContactController else { return nil }

    detailViewController.preferredContentSize =
        CGSize(width: 0.0, height: 600)

    previewingContext.sourceRect = cell.frame

    return detailViewController
}

func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {
    show(viewControllerToCommit, sender: self)
}

在 Techotopia 的教程中,他们使用此代码viewDidLoad来注册预览委托:

if traitCollection.forceTouchCapability == .available {
    registerForPreviewing(with: self, sourceView: view)
} else {
    print("3D Touch Not Available")
}

上面的代码在我的控制台中打印“3D Touch Not Available”,尽管我显然使用的是支持 3D Touch 的设备。所以,我在谷歌上做了一些研究,发现这段代码有效:

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)
    switch traitCollection.forceTouchCapability {
    case .available:
        print("Available")
    case .unavailable:
        print("Unavailable")
    case .unknown:
        print("Unknown")
    }
}

这是我的代码。它在 Xcode 中没有给我任何错误,但是当我在应用程序中使用 3D Touch 时,什么也没有发生,我不知道为什么。

任何帮助,将不胜感激!

标签: iosswift

解决方案


推荐阅读