Peek & pop не срабатывает только в последней ячейке - PullRequest
0 голосов
/ 18 января 2019

У меня есть ProfileVC, который содержит список. Я могу нажать на любую ячейку строки, покажет функцию просмотра и всплывающих окон.

ProfileVC.swift

Я добавил расширение

extension ProfileViewController : UIViewControllerPreviewingDelegate {

    func detailViewController(for indexPath: IndexPath) -> ProfileDetailViewController {
        guard let vc = storyboard?.instantiateViewController(withIdentifier: "ProfileDetailViewController") as? ProfileDetailViewController else {
            fatalError("Couldn't load detail view controller")
        }

        let cell = profileTableView.cellForRow(at: indexPath) as! ProfileTableViewCell

        // Pass over a reference to the next VC
        vc.title   = cell.profileName?.text
        vc.cpe     = loginAccount.cpe
        vc.profile = loginAccount.cpeProfiles[indexPath.row - 1]

        consoleLog(indexPath.row - 1)

        //print("3D Touch Detected !!!",vc)

        return vc
    }

    func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
        if let indexPath = profileTableView.indexPathForRow(at: location) {

            // Enable blurring of other UI elements, and a zoom in animation while peeking.
            previewingContext.sourceRect = profileTableView.rectForRow(at: indexPath)

            return detailViewController(for: indexPath)
        }

        return nil
    }

    //ViewControllerToCommit
    func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {

        // Push the configured view controller onto the navigation stack.
        navigationController?.pushViewController(viewControllerToCommit, animated: true)
    }

}

Затем в том же файле ProfileVC.swift в viewDidLoad() Я зарегистрировал его

if (self.traitCollection.forceTouchCapability == .available){
    print("-------->", "Force Touch is Available")
    registerForPreviewing(with: self, sourceView: view)
}
else{
    print("-------->", "Force Touch is NOT Available")
}

Результат

Понятия не имею, почему я не могу щелкнуть по 4-й ячейке.

Последняя ячейка строки не вызывает Peek & Pop.

Как можно было бы пойти дальше и отладить это?

1 Ответ

0 голосов
/ 19 января 2019

Вы регистрируете корень вашего контроллера представления view в качестве исходного представления для контекстного просмотра.В результате CGPoint, который передается в previewingContext (_ viewControllerForLocation:) `, находится в координатном пространстве этого представления.

Когда вы попытаетесь получить соответствующую строку из вашего табличного представления, точка фактически будетбыть смещенным относительно соответствующей точки в табличном представлении frame на основе относительной позиции табличного представления в корневом представлении.

Это смещение означает, что соответствующая строка не может быть найдена для последней строки в таблице;indexPathForRow(at:) возвращает nil, и ваша функция возвращается, ничего не делая.

Вы также можете обнаружить, что, если вы дотронетесь до нижней части ячейки, вы фактически загляните в следующий ряд.

Вы можете перевести CGPoint во фрейм табличного представления, но проще просто указать свое табличное представление как исходное представление при регистрации для предварительного просмотра:

if (self.traitCollection.forceTouchCapability == .available){
    print("-------->", "Force Touch is Available")
    registerForPreviewing(with: self, sourceView: self.profileTableView)
}
else{
    print("-------->", "Force Touch is NOT Available")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...