7

У меня есть tabBarController, что я добавить, поместив следующий код в:iPhone - presentModalViewController через UITabBarItem и dismissModalViewController чисто

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 был представлен как модальный. Все кажется, просто, неправильно.

+1

Я думаю, вы обнаружите, что приложение Path использует свою собственную реализацию контроллера панели вкладок. то есть не «UITabBarController» от Cocoa Touch – ohhorob

ответ

1

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

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

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

+0

Посмотрите на приложения типа «Путь» и «Stickybits» для функциональности, которой я пользуюсь. – fuzz

+0

См. Скриншот выше в моем исходном вопросе. – fuzz

2

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

- (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]; 
    } 
} 

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

+0

Примечание: не забудьте включить UITabBarControllerDelegate :) – rckehoe

1

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

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

@property (strong, nonatomic) UIViewController *sellTab; 

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

_sellTab = [[UIViewController alloc] init]; 
_sellTab.title = @"Sell"; 
self.viewControllers = @[homeTab, historyTab, _sellTab, bookmarksTab, profileTab]; 

Теперь вот где магия: переопределить следующие методы делегирования контроллера панели вкладок. Код довольно понятен.

#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]; 
    } 
} 

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