В UISplitViewController, как сделать главный контроллер открытого детального представления для iPhone? - PullRequest
1 голос
/ 25 мая 2019

У меня есть немного уникальной настройки UISplitViewController (я думаю). Мой главный контроллер представления является контроллером представления таблицы в контроллере навигации, что является нормальным. Тем не менее, мой контроллер детального просмотра - UITabBarController. Каждая вкладка имеет контроллер навигации, чтобы обернуть содержимое внутри.

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

let detailViewController = masterViewController?.splitViewController
    .viewControllers[1] as? UITabBarController

let selectIndex = 2
let viewController = (detailViewController.viewControllers?[selectIndex] as? UINavigationController)?.viewControllers.first
detailViewController.selectIndex = selectIndex
viewController.show(myCustomViewController)

Это прекрасно работает на iPad. Выбор элемента в таблице контроллера основного вида выбирает вкладку в контроллере подробного представления и выдвигает на него контроллеры представления.

На iPhone у меня при начальной загрузке отображается главный контроллер, используя этот пост :

class MasterViewController: UIViewController {
  private var collapseDetailViewController = true

  override func viewDidLoad() {
    super.viewDidLoad()
    splitViewController?.delegate = self
  }
  // ...
}

extension MasterViewController: UISplitViewControllerDelegate {
  func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool {
    return collapseDetailViewController
  }
}

extension MasterViewController {

  override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    collapseDetailViewController = false
    selectTabAndPush(index: 2, vc: myCustomViewController)
    // Tried swapping the order of these but still no luck
  }
}

Однако выбор строки в таблице контроллера основного вида буквально ничего не делает. Как я могу заставить контроллер подробного представления показывать, когда выбрана строка в главной таблице?

1 Ответ

1 голос
/ 26 мая 2019

Сначала вам нужны обе функции: Master-Detail и Tab. Поскольку, если вы реализуете основную деталь с вкладкой, то у вас должно быть равное количество вкладок с равным количеством строк в Master, тогда только вы можете перейти на вкладку при выборе строки. В iPhone было бы максимум 5 вкладок, и если у вас есть 7 строк в Master, то что будет, если пользователь нажмет на строки 6 и 7?

Потому что согласно концепции проекта: Вы должны выбрать только один согласно требованиям.

  1. Master-Detail -> Предоставляет такие функции, как боковое меню, так что пользователь может получить доступ ко многим другим параметрам из них.
  2. TabBar -> Предоставить дополнительные возможности, имея меню внизу.

В любом случае, у вас может быть какое-то уникальное требование.

Как вы сказали на iPad, он работает нормально. Так что для iPhone вы можете пойти по следующему пути:

  1. Интерфейс в раскадровке должен выглядеть следующим образом: TabBar as DetailView
  2. Создайте или добавьте UITabBarController в свой проект. (Я создал tabbarcontroller с именем CustomTabController).
  3. Затем в didSelectRowAt нажмите tabbarcontroller:

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.phone {
            let tabController = self.storyboard?.instantiateViewController(withIdentifier: "CustomTabController") as! CustomTabController
            self.navigationController?.pushViewController(tabController, animated: true)
            tab.selectedIndex = indexPath.row
        }
        else {
            // iPad code here
        }
    }
    

Но убедитесь, что у вас достаточно количества вкладок, равного количеству строк.

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