Можно ли открыть полноэкранный контроллер в расширении Share вместо всплывающего окна (по умолчанию)

Я работаю над Share extension, и у меня есть один запрос, связанный с этим.

Можно ли открыть полноэкранный контроллер в расширении Share, также можем ли мы добавить UITableView или другое IBoutlet, используя Storyboard в Share extension.

заранее спасибо


person Zoeb S    schedule 31.10.2017    source источник
comment
Да, вотсап так делает.   -  person Rajan Maheshwari    schedule 31.10.2017
comment
Проверьте это, это старая версия Swift, но вы можете получить от нее помощь. github.com/martinnormark/ShareByMail   -  person Rajan Maheshwari    schedule 31.10.2017


Ответы (1)


Шаг 1. Добавьте новый UIViewController с именем MainPageViewController.

Шаг 2. Добавьте новый контроллер представления в MainInterface Storyboard, измените его класс на MainPageViewController в разделе Custom Class раскадровки, установите Storyboard ID на MainPageViewController в разделе Identity.

Шаг 3. Откройте файл info.plist расширения Share.

По умолчанию это выглядит примерно так-

<key>NSExtension</key>
    <dict>
        <key>NSExtensionAttributes</key>
        <dict>
            <key>NSExtensionActivationRule</key>
            <string>TRUEPREDICATE</string>
        </dict>
        <key>NSExtensionMainStoryboard</key>
        <string>MainInterface</string>
        <key>NSExtensionPointIdentifier</key>
        <string>com.apple.share-services</string>
    </dict>

Теперь вместо клавиши NSExtensionMainStoryboard по умолчанию используйте клавишу NSExtensionPrincipalClass, поэтому окончательный результат будет

<key>NSExtension</key>
        <dict>
            <key>NSExtensionAttributes</key>
        <dict>
            <key>NSExtensionActivationRule</key>
            <string>TRUEPREDICATE</string>
        </dict>
            <key>NSExtensionPrincipalClass</key>
            <string>HomeViewController</string>
            <key>NSExtensionPointIdentifier</key>
            <string>com.apple.share-services</string>
        </dict>

Где HomeViewController — наш новый контроллер точки входа.

Шаг 4. Теперь самое важное нужно исправить странную проблему, связанную с именованием модулей.

Чтобы исправить это, нам нужно добавить @objc(HomeViewController) вверху вашего файла HomeViewController.

Шаг 5. Также для анимации презентации нам нужно добавить код анимации в viewWillAppear

См. ниже ссылочный код:

import UIKit

@objc(HomeViewController)

class HomeViewController : UINavigationController {

     init() {
        let viewController:UIViewController = UIStoryboard(name: "MainInterface", bundle: nil).instantiateViewController(withIdentifier: "MainPageViewController") as UIViewController
        super.init(rootViewController: viewController)
    }

    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
        })
    }
}

Где MainPageViewController это идентификатор вашего MainViewController, который мы хотим предъявить.

Шаг 6. Чтобы отключить анимацию, мы можем создать новую функцию в классе MainPageViewController:

func hideExtensionWithCompletionHandler(completion:@escaping (Bool) -> Void) {
    UIView.animate(withDuration: 0.20, animations: {

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

вызовите выше функцию на кнопке «Сохранить» или «Отмена» и внутри блока, мы можем вызвать completeRequest или cancelRequest(withError:)

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

Теперь делай что хочешь, чувак, делай двойное чувак ;-)

person Zoeb S    schedule 02.11.2017