Почему UIActivityViewController вызывает viewWillDisappear () для докладчика? - PullRequest
1 голос
/ 18 октября 2019

Я представляю UIActivityViewController для совместного использования видео .mp4 с URL-адреса:

let viewController: UIViewController = ... // the presenting view controller
let url: URL = ... // local file

let activityController = UIActivityViewController(activityItems: [url], applicationActivities: nil)
viewController.present(activityController, animated: false, completion: nil)

Если выбран параметр «Сохранить видео», видео сохраняется, но представление UIViewController исчезает (и я вижу, что .viewWillDisappear() вызывается для него.)

Как сделать так, чтобы представление UIViewController не исчезало?

Обратите внимание, что все остальные параметры общего доступа, которые япытался не иметь этой проблемы (сообщения, airdrop, instagram).

Я пытался установить sourceView и sourceRect, но, похоже, это не помогает.

activityController.popoverPresentationController?.sourceView = viewController.view!
activityController.popoverPresentationController?.sourceRect = viewController.view!.frame

Я искал ошибки, но не нашел:

activityController.completionWithItemsHandler = { (a: UIActivity.ActivityType?, b: Bool, c: [Any]?, d: Error?) in
    if let error = d {
        print(error)
    }
}

Кроме того, все мои UIViewController переопределения жизненного цикла называют их супер, то есть:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
}

ЭтоВот как это выглядит: a disappearing view

Это сводит на нет весь мой взгляд!

Для чего стоит, viewController настраивается путем вызова segue, который настраивается в раскадровке:

class LaunchController : UIViewController {

    var performedSegue = false

    override func viewDidLayoutSubviews() {
        if !performedSegue {
            self.performSegue(withIdentifier: "main", sender: self)
            performedSegue = true
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

Похоже, эта «функция» была введена Apple в iOS 13. Я протестировал ее на iOS 12, и представление ViewController не исчезает.

Я проследил стек вызовов, и кажется, что UIActivityViewController вызываетотклонить при представлении контроллера представления (или его UINavigationController) при успешном сохранении в рулон камеры.

enter image description here

Я не знаю, как это предотвратить, поскольку это частный API Apple, и в документации по этому поводу ничего нет. Единственный способ, который я нашел, это установить какой-либо флаг savingToCameraRoll и установить его на true при представлении UIActivityViewController, переопределить метод dismiss при представлении ViewController и затем проверить этот флаг внутри dismiss.

override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
    if !savingToCameraRoll {
         // Dismiss view controller if UIActivityViewController not in use
         super.dismiss(animated: animated, completion: completion)
    }

    // Handle UIActivityViewController dismiss attempt. 
    // If you do nothing, the presenting ViewController should not be dismissed.
}

Вы также должны не забыть установить savingToCameraRoll на false в completionWithItemsHandler.

1 голос
/ 21 октября 2019

В раскадровке я пометил представление ViewController как «Is Initial View Controller» вместо того, чтобы представлять его через последовательный переход. Это решило проблему для меня (хотя это обходной путь, который не будет работать вообще).

...