Подтвердить что ты не робот

Обработка навигации из части приложения, отличной от Ui?

Примечание.. Когда я говорю о приложении Backback, я не имею в виду серверный сервер. Бэкэнд приложения является частью приложения. Это не-ui часть приложения.

У меня вопрос проектирования кода. Использование j2objc Java используется в качестве бэкэнд приложения iOS, где внешний интерфейс по-прежнему Objective-C.

Какая часть (передняя часть или бэкэнд) должна управлять навигацией в этой модели?

Рассмотрим следующее. Загружен начальный ViewController. Пользователь нажал на кнопку. Вот два возможных случая:

  • передняя часть принимает жест и открывает запрошенный ViewController

  • передняя часть принимает жест и сообщает о действии на бэкэнд Java. Бэкэнд Java решает, какую страницу открыть дальше, и сообщит переднюю часть, на которой должен быть показан ViewController.

Для меня второе решение, похоже, имеет смысл в поворотах разделения кода. Но есть одна проблема, которая возникла у меня. Предположим, что в вашем приложении есть следующая структура ViewController:

  • Начальная страница: UIViewController Главная: UINavigationViewController
  • > Main-TabPage1: UIPageViewController
  • > Main-TabPage2: UIPageViewController
  • > Main-TabPage3: UIPageViewController Настройки: UIViewController

Если вы переходите на уровень приложения, это просто. Вы просто говорите, что передняя часть открыта "Начальная страница", "Главная" или "Настройки". Но, что из использования нажала кнопку, чтобы перейти в Main > Main-TabPage3 с начальной страницы или из Main > Main-TabPage1. Вы должны сделать следующее:

  • в случае, если вы находитесь на стартовой странице: вы должны сообщить Front Front, что он должен просмотреть Main, а затем Main TabPage3.
  • в случае, если вы находитесь на Main > Main-TabPage1: вы должны сказать Front Front, что он должен просто открыть Main-TabPage3.

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

Является ли это допустимым способом выявления представлений из задней части Java или вы видите лучший способ сделать это?

4b9b3361

Ответ 1

Хорошая практика состоит в том, чтобы разделить ваше приложение на две части:

Домен. Содержит все классы обслуживания для удаленной связи (то есть, если вам нужно ударить отдаленный сервер) и всех классов и моделей, связанных с вашей бизнес-логикой. Эта часть является той, которая использует j2objc, и вы хотите, чтобы она не была привязана к вашему пользовательскому интерфейсу.

Пользовательский интерфейс. Здесь присутствуют все ViewControllers и Views.

Почему они отличаются друг от друга?

Как только вы настроите свою бизнес-логику, вы должны хорошо сгенерировать свой код с помощью j2objc и оставить его практически нетронутым. Ваш пользовательский интерфейс, с другой стороны, может сильно измениться в течение срока действия вашего приложения (помните, как iOS 7 заставил каждого разработчика обновлять визуальное представление своих приложений). Вы хотите, чтобы обновления в домене или пользовательском интерфейсе влияли на другую часть.

Как они работают вместе?

После действия (например, нажатия на кнопку) вы можете спросить домен, выполняются ли какие-либо предварительные условия (т.е. это новый пользователь?), а затем вы создаете экземпляр ViewController для отображения. Пользовательский интерфейс может предоставлять данные в домене или запрашивать некоторые, но его обязанность заключается в создании экземпляров Views/ViewControllers.

Сложная маршрутизация

В приложениях, где мне нужно ориентироваться где-нибудь на основе удаленного push-уведомления или на основе некоторой сложной логики, я стараюсь, чтобы объект (называемый "маршрутизатор" ) обрабатывал все это. Он все еще находится в части пользовательского интерфейса, и вы передаете ему объекты домена, необходимые для принятия решений. Затем он возвращает объект навигации с изображением стека навигации (это может быть объект, обрабатывающий строку, похожую на URL-адрес), которую вы можете дать рекурсивно для просмотра viewControllers.

Скажем, ваш объект "router" возвращает навигационный объект "firstVC/secondVC/thirdVC" в AppDelegate. AppDelegate может вызвать метод dequeue, который возвращает "firstVC", и на основе этого экземпляра объекта "firstViewController" добавляется в стек UINavigationController. Затем он передает объект "router" этому недавно созданному ViewController, который также вызывает метод dequeue для получения "secondVC". Исходя из этого, "firstViewController" будет создавать экземпляр объекта "secondViewController" для добавления в стек UINavigationController. Затем он передал бы тот же объект "router" этому объекту "secondViewController" , и он снова вызовет метод dequeue для получения "третьего VC" и создаст экземпляр соответствующего ViewController.

Таким образом, вы создаете свой навигационный стек, позволяя каждому ViewController создавать экземпляр другого ViewController, о котором он знает (в моем предыдущем примере "firstViewController" знает о "secondViewController" , потому что в его представлении есть кнопка, позволяющая пользователю достичь представления "secondViewController" , но не знает о "thirdViewController" ).

Вы также можете создать свой AppDelegate весь стек навигации, но поскольку ваш "firstViewController" уже имеет заголовок "secondViewController" , импортированный для работы кнопки, лучше разрешить ему выполнять работу, связанную с этим ViewController, и т.д.

Рабочий образец

Вот демонстрационный проект, который я сделал, чтобы проиллюстрировать, что я только что показал.

Классы, содержащиеся в папке "Домен", могут быть вашими классами, сгенерированными с помощью j2objc. Метод buildNavigationStack в AppDelegate создает функциональный навигационный стек с объектом "Router". Я сделал этот скелет проекта простым, демонстрируя несколько шаблонов, таких как фабрики для централизованных и организованных экземпляров классов, и viewData, которые инкапсулируют объект модели и выводят данные, готовые для отображения. Его можно было бы улучшить с помощью нескольких протоколов, чтобы сделать вещи более абстрактными, но я старался держать их простыми с самого начала.

Ответ 2

Я думаю, что хороший способ - отправить локальное уведомление из App Backend и позволить ему реагировать на него и отобразить правильный ViewController с настройкой, что если вид не будет виден, он должен увидеть действие, которое будет отображаться

например, в случае, если вы объяснили, что код будет следующим:

Из бэкэнд:

NSDictionary *userInfo = @{@"view": @"TabPage3"};
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter postNotificationName:@"ShowView" object:nil userInfo:userInfo];`

внутри MainView

- (void)viewDidLoad {
    [self viewDidLoad];
    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
    [notificationCenter addObserver:self selector:@selector(showView:) name:@"ShowView" object:nil];
}
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    if(self.receivedNotification != nil){
        [self showView:self.receivedNotification];
        self.receivedNotification = nil;
    }
}
- (void)showView:(NSNotification*)notification {
    if (viewController.isViewLoaded && viewController.view.window) {
        // viewController is visible
        if ([notification.userInfo valueForKey:@"TabPage3"]){
            [self.tabBarController setSelectedIndex:3];
        }
    } else {
        self.receivedNotification = notification;
    }
}

внутри StartPage

- (void)viewDidLoad {
    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
    [notificationCenter addObserver:self selector:@selector(showView:) name:@"ShowView" object:nil];
}
- (void)showView:(NSNotification*)notification {
    if ([notification.userInfo valueForKey:@"TabPage3"]){
        [self.NavigationController pushViewController:mainViewController animated:YES];
    }
}