7

mam tabBarController że dodawanie przez wprowadzenie kodu w następujący:iPhone - presentModalViewController poprzez UITabBarItem i dismissModalViewController czysto

AppDelegate.h:

... 
    UITabBarController IBOutlet *tabBarController; 
} 

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

AppDelegate.m:

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

I następnie użyć następującego kodu do przedstawienia środków transportu skanowanie kodów kreskowych Zobacz Kontroler:

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

Gdy to rzeczywiście dostać przedstawiony Myślę, że ta metoda nie jest atrakcyjne wizualnie, bo kiedy oddalić widok modalne Mam przyniósł z powrotem do pustego widoku.

Wiele aplikacji lub aplikacji do skanowania kodów kreskowych, które po prostu wyświetlają np. Selektor obrazu; zrób to całkiem pomyślnie. Zastanawiam się, jakiego rodzaju implementacji użyliby, aby osiągnąć taki efekt.

To jest zrzut ekranu z aplikacji o nazwie Ścieżka, który ma dokładnie taką samą funkcjonalność jestem po:

alt text

Zauważyłem również, że w tych zastosowaniach, jeśli jesteś na dowolny inny element paska tabulacji inny niż środkowy, powiedzmy, a ty klikniesz na element paska kart, który prezentuje widok modalny, gdy zostanie odrzucony, to faktycznie nie przywróci go do pustego widoku, ale zwalnia jak zwykle, jednak rzeczywista zakładka element paska przedstawiający widok modalny nigdy nie jest wybierany. Byłbym zadowolony z tego rodzaju funkcjonalności, jeśli jest to jedyny sposób na wprowadzenie tego typu efektu.

Każda pomoc będzie bardzo ceniona, ponieważ utknąłem w tym od dłuższego czasu. Nie jestem nawet pewien, czy jest to właściwy sposób umieszczenia całego tego kodu w moim AppDelegate, aby kontroler widoku mógł być prezentowany jako modalny. Wszystko wydaje się po prostu złe.

+1

Myślę, że okaże się, że aplikacja Ścieżka używa własnej implementacji kontrolera paska kart. tj. nie "UITabBarController" z Cocoa Touch – ohhorob

Odpowiedz

1

Nie należy przedstawiać widoku modalnego, gdy użytkownik kliknie element paska kart.

Zamiast tego można wyświetlić widok modalny z widoku wyświetlanego przez jedną z kart.

Jeśli masz tylko jeden widok główny i widok skanowania, który chcesz przedstawić modalnie, po prostu użyj przycisku, aby wyświetlić widok skanowania w widoku głównym. Można na przykład zamiast tego użyć paska narzędzi z jednym przyciskiem.

+0

Zobacz funkcje, takie jak Path i Stickybits, dla funkcji, której szukam. – fuzz

+0

Zobacz zrzut ekranu powyżej w oryginalnym pytaniu. – fuzz

2

Kiedy odrzucenie modalne kontroler widok, powiedz pasek kart, aby wybrać cokolwiek zakładka została pierwotnie wybrana .

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

Trzeba by zachować oryginalne wybór pasku kart w zmiennej na początku 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]; 
    } 
} 

W tym kodzie mogą występować błędy, po prostu wpisałem je bez testowania.

+0

Uwaga: Nie zapomnij dołączyć UITabBarControllerDelegate :) – rckehoe

1

Znalazłem naprawdę łatwe rozwiązanie, grając około UITabBarControllerDelegate - Próbowałem tego jednak tylko w iOS 7.

Najpierw, podklasa UITabBarController, zrób jej własną UITabBarControllerDelegate i utwórz właściwość, która będzie zawierać odniesienie do karty, z którą chcesz uruchomić modalny. W mojej aplikacji jest to karta "Sprzedaj".

@property (strong, nonatomic) UIViewController *sellTab; 

Następnie w metodzie init, wystarczy utworzyć tego kontrolera widoku i dodać go do zakładek.

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

Teraz tutaj jest magia: zastąp następujące metody przekazywania kontrolerów paska tabulacji. Kod jest dość oczywisty.

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

Ten rozpocznie modalne, który po dymisji, pokazuje tę samą kartę byłeś w przed startem.

Powiązane problemy