Как программно отобразить контроллер представления (включая контроллер навигации) в расширении сообщений (Swift)?
Ну, это приложение только для iMessage, означающее, что используется только расширение "Сообщения" и ничего больше. Весь пользовательский интерфейс настроен программно и раскадровки не используются. Хотя UIViewController
отображается, навигационная иерархия отсутствует. Я предполагаю, что все на месте. Или, возможно, есть тривиальная ошибка, которую я не могу понять.
- E сть
UITableView
отображается, как показано ниже, в основномMessagesViewController
, Нажатие на одну из них, вероятно, приведет нас к более подробной информации, в данном случае к дополнительным таблицам.
Код для того же есть,
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)
}
}
- Итак, вот больше таблиц, о которых мы говорили ранее. Ну, только одна таблица с несколькими строками. Пожалуйста, найдите изображение для этого.
Выше отображается, когда нажата "Подтверждения" на первом экране. Панель навигации не отображается так, как она должна быть. Но это можно отрегулировать. Давайте перейдем к коду.
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")
}
}
- Нажатие на "Переполнение стека" даст нам следующее.
- Но, нажав "Готово" здесь даст это!!
Навигационная панель, вероятно, скрыта позади!
Есть ли лучший способ реализации контроллеров представления внутри расширения сообщений? Я новичок в Swift и iOS-программировании в целом. Прошу прощения, если мои ошибки слишком глупы.