iPhone - присутствуетModalViewController через UITabBarItem и чисто dismissModalViewController - PullRequest
7 голосов
/ 13 января 2011

У меня есть tabBarController, который я добавляю, помещая следующий код в:

AppDelegate.h:

    ...
    UITabBarController IBOutlet *tabBarController;
}

@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;

AppDelegate.m:

    ...
   [self.window addSubview:tabBarController.view];
   [self.window makeKeyAndVisible];
   [tabBarController setDelegate:self];

Затем я использую следующий код для представления модального сканирования штрих-кода View Controller:

- (void)tabBarController:(UITabBarController *)tbc didSelectViewController:(UIViewController *)vc {
        // Middle tab bar item in question.
        if (vc == [tabBarController.viewControllers objectAtIndex:2]) {
           ScanVC *scanView = [[ScanVC alloc] initWithNibName:@"ScanViewController" bundle:nil];

           // set properties of scanView's ivars, etc

           UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:scanView];

           [tabBarController presentModalViewController:navigationController animated:YES];
           [navigationController release];
           [scanView release];
        }
    }

Когда он действительно представлен, я думаю, что этот метод визуально не привлекательный, потому что, когда я отклоняю модальное представление, я возвращаюсь к пустому представлению.

Множество приложений для сканирования штрих-кодов или приложений, которые, например, просто отображают средство выбора изображений; сделать это довольно успешно. Мне просто интересно, какую реализацию они использовали бы для достижения такого эффекта.

Это скриншот приложения под названием Path , которое имеет ту же функциональность, что и я:

alt text

Я также заметил, что в этих приложениях, если вы находитесь, скажем, на каком-либо другом элементе панели вкладок, кроме среднего, и нажимаете на элемент панели вкладок, который представляет модальное представление, как только он отклоняется, он фактически возвращает их к пустому представлению, которое он отклоняет как обычно, однако фактический элемент панели вкладок, который представляет модальное представление, никогда не выбирается. Я был бы счастлив с этим типом функциональности, если бы это был единственный способ реализовать этот тип эффекта.

Любая помощь будет принята с благодарностью, так как я застрял в этом довольно долгое время. Кроме того, я даже не уверен, что это правильный способ поместить весь этот код в мой AppDelegate, чтобы View Controller был представлен как модальный. Все кажется просто неправильным.

Ответы [ 4 ]

2 голосов
/ 05 декабря 2013

Я нашел действительно простое решение, поиграв с UITabBarControllerDelegate - я попробовал это только в iOS 7.

Сначала подкласс UITabBarController, сделайте его собственным UITabBarControllerDelegate и создайтесвойство, которое будет содержать ссылку на вкладку, с которой вы хотите запустить модал.В моем приложении она называется вкладкой «Sell».

@property (strong, nonatomic) UIViewController *sellTab;

Затем, в вашем методе init, просто создайте этот контроллер представления и добавьте его на вкладки.

_sellTab = [[UIViewController alloc] init];
_sellTab.title = @"Sell";
self.viewControllers = @[homeTab, historyTab, _sellTab, bookmarksTab, profileTab];
* 1012Теперь вот где магия: переопределить следующие методы делегата контроллера панели вкладок.Код довольно понятен.
#pragma mark - Tab bar controller delegate

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
    return viewController != self.sellTab;
}

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
{
    if (item == self.sellTab.tabBarItem) {
        [self presentViewController:[[UINavigationController alloc] initWithRootViewController:[[PostAdViewController alloc] init]] animated:YES completion:nil];
    }
}

Это запустит модальный режим, который после увольнения показывает ту же вкладку, в которой вы были до запуска.

2 голосов
/ 17 января 2011

Не совсем то, что мне нужно, но я думаю, что могу двигаться дальше от этого:

http://idevrecipes.com/2010/12/16/raised-center-tab-bar-button/

2 голосов
/ 17 января 2011

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

- (void)dismissModalViewControllerAnimated:(BOOL)animated
    {
        // do whatever you need to do when dismissing

        // savedTabIndex is an int ivar
        // tabBarController is a reference, set when showing the modal view
        [[self tabBarController] setSelectedIndex:savedTabIndex];
    }

Вам потребуется сохранить исходный выбор панели вкладок в переменной в начале tabBarController:didSelectViewController:.

- (void)tabBarController:(UITabBarController *)tbc
 didSelectViewController:(UIViewController *)vc
{
    // Save the tab bar index (if it's not the photo tab)
    if ([tabBarController selectedIndex] != 3]) {
        savedTabIndex = [tabBarController selectedIndex];
    }
}

В этом коде могут быть ошибки, я набрал его без тестирования.

1 голос
/ 15 января 2011

Не следует представлять модальное представление, когда пользователь нажимает на элемент панели вкладок.

Вместо этого вы можете представить модальное представление из представления, представленного одной из вкладок.

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

...