Поделиться расширением с пользовательским классом вместо SLComposeServiceViewController

В настоящее время я работаю с функцией расширения общего доступа.

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

Но я ожидаю, что пользовательский класс UIViewController загружается с выбранным изображением из приложения для фотографий, где бы он ни был похож на компоновщика почты при открытии mail extension on share sheet

Итак, я получил этот образец и следовал инструкциям, приведенным в этом источнике, по приведенной ниже ссылке на git hub (вторая):

Да вроде 4 years ago так что миграция и конвертация в Swift 4.1 версию. После того, как я изменил эти изменения и отладил их. Это не работает, как на GitHub gif. Да, в первый раз я могу отображать и отключать контроллер, когда касаюсь приложения расширения на листе общего доступа. Но после того, как я отклонил и снова попытался представить его, на этот раз он не отреагировал на GitHub gif.

Мартин только показывает и скрывает self.view of UINavigationController Y position value. Однажды я нажал кнопки панели Cancel or save, затем попытался открыть его по расширению на листе общего доступа, он не работает и никакой реакции.

Вот источник для NSExtensionPrincipalClass - EntryViewController

import UIKit  

@objc(EntryViewController)


class EntryViewController : UINavigationController {

init() {
    super.init(rootViewController: ShareViewController())
}

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)!
}

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    self.view.transform = CGAffineTransform(translationX: 0, y: self.view.frame.size.height)

    UIView.animate(withDuration: 0.25, animations: { () -> Void in
        self.view.transform = CGAffineTransform.identity
    }, completion: nil)
}
}

import UIKit
import Social

class ShareViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    self.view.backgroundColor = .white
    self.navigationItem.title = "Share this"

    self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(self.cancelButtonTapped(_:)))
    self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .save, target: self, action: #selector(self.saveButtonTapped(_:)))
}

@objc func saveButtonTapped(_ sender: UIBarButtonItem) {
    self.hideExtensionWithCompletionHandler(completion: { (Bool) -> Void in
        self.extensionContext!.completeRequest(returningItems: nil, completionHandler: nil)
    })
}

@objc func cancelButtonTapped(_ sender: UIBarButtonItem) {
    self.hideExtensionWithCompletionHandler(completion: { (Bool) -> Void in
        self.extensionContext!.cancelRequest(withError: NSError())
    })
}

func hideExtensionWithCompletionHandler(completion:(Bool) -> Void) {

    UIView.animate(withDuration: 0.20, animations: { () -> Void in
        self.navigationController!.view.transform = CGAffineTransform(translationX: 0, y: self.navigationController!.view.frame.size.height)
    }, completion: nil)
}
}

Как найти и исправить проблемы в приведенной выше попытке или как сделать собственный макет UIViewController вместо использования SLComposeServiceViewController?


person Ram    schedule 17.07.2018    source источник
comment
Почему вы используете UINavigationController? есть ли какой-либо толчок от «ShareViewController»?   -  person Kaushik Makwana    schedule 18.07.2018
comment
@KaushikMakwana Я следовал инструкциям по этой ссылке - martinnormark.com /present-ios-8-share-extension-as-modal-view Вы можете проверить причину использования UINavigationController под этим текстом Подделать модальное представление   -  person Ram    schedule 18.07.2018
comment
Нет необходимости использовать «UINavigationController», вы можете напрямую использовать «ShareViewController», это легко для вас, и любой макет, который вы хотите, спроектируйте на раскадровке.   -  person Kaushik Makwana    schedule 18.07.2018
comment
@KaushikMakwana почему storyboard ? невозможно программно создать собственный макет?   -  person Ram    schedule 18.07.2018
comment
Да, вы также можете спроектировать его программно   -  person Kaushik Makwana    schedule 18.07.2018


Ответы (1)


На вашем контроллере представления (метод действия кнопки)

Цель С

Вызовите это, когда вы завершите свой процесс

[self.extensionContext completeRequestReturningItems:@[] completionHandler:nil];

Вызывайте это, когда вы/пользователь отменяете свой процесс

NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain code:NSUserCancelledError userInfo:nil];
[self.extensionContext cancelRequestWithError:error];

Быстрый

Вызовите это, когда вы завершите свой процесс

self.extensionContext?.completeRequestReturningItems([], completionHandler:nil)

Вызывайте это, когда вы/пользователь отменяете свой процесс

let cancelError = NSError(domain: NSCocoaErrorDomain, code: NSUserCancelledError, userInfo: nil)
self.extensionContext!.cancelRequestWithError(cancelError)

Если у вас есть ошибка API

self.extensionContext!.cancelRequestWithError(error as NSError)

Обновлять

В вашем коде вы не вызвали обработчик завершения в этом методе hideExtensionWithCompletionHandler

func hideExtensionWithCompletionHandler(completion:@escaping (Bool) -> Void) {
    UIView.animate(withDuration: 0.20, animations: { () -> Void in
        self.navigationController!.view.transform = CGAffineTransform(translationX: 0, y: self.navigationController!.view.frame.size.height)
    }, completion: { (_) -> Void in
        completion(true)
    })
}
person Mathi Arasan    schedule 23.07.2018