Как программно отобразить контроллер представления (включая контроллер навигации) в расширении сообщений (Swift)?

Ну, это приложение только для iMessage, означающее, что используется только расширение "Сообщения" и ничего больше. Весь пользовательский интерфейс настроен программно и раскадровки не используются. Хотя UIViewController отображается, навигационная иерархия отсутствует. Я предполагаю, что все на месте. Или, возможно, есть тривиальная ошибка, которую я не могу понять.

  1. E сть UITableView отображается, как показано ниже, в основном MessagesViewController, Нажатие на одну из них, вероятно, приведет нас к более подробной информации, в данном случае к дополнительным таблицам.

TableView

Код для того же есть,

class MessagesViewController: MSMessagesAppViewController {
    lazy var extraTableView: UITableView = {
        let view = UITableView()
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }()

        extraTableView.delegate = self
        extraTableView.dataSource = self
        extraTableView.isScrollEnabled = false
        sections = [Section(type: .extraTableViewRow,
                            items: [.settings, .restoreInAppPurchase, .acknowledgments,.support])]
}

Не беспокойтесь о разделах, так как они представляют собой просто перечисления и структуры, используемые для заполнения таблицы. Это действительно легко сделать. Если кто-то думает, что это поможет, пожалуйста, найдите его по адресу https://swiftwithjustin.co/2016/02/05/enumified-tableview-with-dynamic-prototype-cells-in-swift/

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

extension MessagesViewController: UITableViewDelegate, UITableViewDataSource {

    func numberOfSections(in tableView: UITableView) -> Int {
        return sections.count
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return sections[section].items.count
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 51.5
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell : UITableViewCell = UITableViewCell(style: UITableViewCellStyle.default ,
                                                     reuseIdentifier: "mycell")
        cell.accessoryType = .disclosureIndicator
//        cell.selectionStyle = .none

        switch sections[(indexPath as NSIndexPath).section].items[(indexPath as NSIndexPath).row] {
        case .settings:
            cell.textLabel?.text = NSLocalizedString("Settings", comment: "")
        case .restoreInAppPurchase:
            cell.textLabel?.text = NSLocalizedString("Restore In-App Purchase", comment: "")
        case .acknowledgments:
            cell.textLabel?.text = NSLocalizedString("Acknowledgments", comment: "")
        case .support:
            cell.textLabel?.text = NSLocalizedString("Support/Feedback", comment: "")
        }

        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        switch sections[indexPath.section].items[indexPath.row] {
        case .settings:
            settings()
        case .restoreInAppPurchase:
            restoreInAppPurchase()
        case .acknowledgments:
            acknowledgments()
        case .support:
            support()
        }

        tableView.deselectRow(at: indexPath as IndexPath, animated: true)
    }
}

Чтобы это работало, ниже приведен код,

extension MessagesViewController {

func settings() {

}

func restoreInAppPurchase() {

}

func acknowledgments() {
    let navigationController = UINavigationController(rootViewController: acknowledgmentsViewController)
    let btnDone = UIBarButtonItem(title: "Done", style: .done , target: self, action: #selector(dismissNav))
    navigationController.topViewController?.navigationItem.leftBarButtonItem = btnDone
    self.present(navigationController, animated: true) {
        var frame = navigationController.view.frame
        if DeviceType.isiPhone5OrLater {
            frame.origin = CGPoint(x: frame.origin.x, y: frame.origin.y + 51)
            frame.size = CGSize(width: frame.width, height: frame.height - 93)
        } else if DeviceType.isiPhone6OrLater || DeviceType.isiPhone6PlusOrLater {
            frame.origin = CGPoint(x: frame.origin.x, y: frame.origin.y + 71)
            frame.size = CGSize(width: frame.width, height: frame.height - 113)
        }
        navigationController.view.frame = frame
    }
}

func support() {

}

func dismissNav() {
    self.dismiss(animated: true, completion: nil)
}

}

  1. Итак, вот больше таблиц, о которых мы говорили ранее. Ну, только одна таблица с несколькими строками. Пожалуйста, найдите изображение для этого.

Подтверждения

Выше отображается, когда нажата "Подтверждения" на первом экране. Панель навигации не отображается так, как она должна быть. Но это можно отрегулировать. Давайте перейдем к коду.

class AcknowledgmentsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    lazy var acknowledgmentsTableView: UITableView = {
        let view = UITableView()
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }()

    enum SectionType {
        case acknowledgmentsTableViewRow
    }

    enum Item {
        case stackru
        case github
        case bitbucket
    }

    struct Section {
        var type: SectionType
        var items: [Item]
    }

    var sections = [Section]()

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        self.automaticallyAdjustsScrollViewInsets = false
        self.acknowledgmentsTableView.tableFooterView = UIView(frame: CGRect.zero)
        setupAcknowledgmentsView()
    }

    func setupAcknowledgmentsView() {
        updateAcknowledgmentsViews()
        colorAcknowledgmentsViews()
        addAcknowledgmentsViews()
        setupAcknowledgmentsConstraints()
    }

    fileprivate func updateAcknowledgmentsViews() {

        // acknowledgmentsTableView
        acknowledgmentsTableView.delegate = self
        acknowledgmentsTableView.dataSource = self
        sections = [Section(type: .acknowledgmentsTableViewRow,
                            items: [ .stackru, .github, .bitbucket])]

    }

    fileprivate func colorAcknowledgmentsViews() {
//        acknowledgmentsTableView.backgroundColor = UIColor.purple
    }

    fileprivate func addAcknowledgmentsViews() {
        view.addSubview(acknowledgmentsTableView)
    }

    fileprivate func setupAcknowledgmentsConstraints() {

        // acknowledgmentsTableView
        let acknowledgmentsTableViewLeadingConstraint = acknowledgmentsTableView.leadingAnchor.constraint(equalTo: view.leadingAnchor)
        let acknowledgmentsTableViewTrailingConstraint = acknowledgmentsTableView.trailingAnchor.constraint(equalTo: view.trailingAnchor)
        let acknowledgmentsTableViewTopConstraint = acknowledgmentsTableView.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor)
        let acknowledgmentsTableViewBottomConstraint = acknowledgmentsTableView.bottomAnchor.constraint(equalTo: bottomLayoutGuide.topAnchor)

        // Add Constraints
        NSLayoutConstraint.activate([acknowledgmentsTableViewLeadingConstraint,
                                     acknowledgmentsTableViewTrailingConstraint,
                                     acknowledgmentsTableViewTopConstraint,
                                     acknowledgmentsTableViewBottomConstraint])
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return sections.count
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return sections[section].items.count
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 51.5
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell : UITableViewCell = UITableViewCell(style: UITableViewCellStyle.default ,
                                                     reuseIdentifier: "mycell")
        cell.accessoryType = .disclosureIndicator

        switch sections[(indexPath as NSIndexPath).section].items[(indexPath as NSIndexPath).row] {
        case .stackru:
            cell.textLabel?.text = NSLocalizedString("Stack Overflow", comment: "")
        case .github:
            cell.textLabel?.text = NSLocalizedString("Github", comment: "")
        case .bitbucket:
            cell.textLabel?.text = NSLocalizedString("Bitbucket", comment: "")
        }

        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        switch sections[indexPath.section].items[indexPath.row] {
        case .stackru:
            stackru()
        case .github:
            github()
        case .bitbucket:
            bitbucket()
        }

        tableView.deselectRow(at: indexPath as IndexPath, animated: true)
    }

    func open(website : String) {

        let safariViewController = SFSafariViewController(url: NSURL(string: website)! as URL)
        self.present(safariViewController, animated: true) {
            var frame = safariViewController.view.frame
            if DeviceType.isiPhone5OrLater {
                frame.origin = CGPoint(x: frame.origin.x, y: frame.origin.y + 51)
                frame.size = CGSize(width: frame.width, height: frame.height - 93)
            } else if DeviceType.isiPhone6OrLater || DeviceType.isiPhone6PlusOrLater {
                frame.origin = CGPoint(x: frame.origin.x, y: frame.origin.y + 71)
                frame.size = CGSize(width: frame.width, height: frame.height - 113)
            }
            safariViewController.view.frame = frame
        }
    }

    fileprivate func stackru() {
        open(website: "https://en.wikipedia.org/wiki/Stack_Overflow")
    }

    fileprivate func github() {
        open(website: "https://en.wikipedia.org/wiki/GitHub")
    }

    fileprivate func bitbucket() {
        open(website: "https://en.wikipedia.org/wiki/Bitbucket")
    }
}
  1. Нажатие на "Переполнение стека" даст нам следующее.

переполнение стека

  1. Но, нажав "Готово" здесь даст это!!

проблема

Навигационная панель, вероятно, скрыта позади!

Есть ли лучший способ реализации контроллеров представления внутри расширения сообщений? Я новичок в Swift и iOS-программировании в целом. Прошу прощения, если мои ошибки слишком глупы.

0 ответов

Другие вопросы по тегам