Cześć, pracuję nad aplikacją, w której używam paska kart. Pasek kart powinien mieć 5 kart, jeśli użytkownik jest zalogowany, ale tylko 3, jeśli użytkownik jest wylogowany. Mam instrukcję if w moim MainAppDelegate.m, która wygląda tak, gdzie "uid" wskazuje, czy użytkownik jest zalogowany.

UIViewController *popular = [[[PopularViewController alloc] initWithNibName:@"PopularViewController" bundle:nil] autorelease];
UIViewController *upcoming = [[[UpcomingViewController alloc] initWithNibName:@"UpcomingViewController" bundle:nil] autorelease];
UIViewController *account = [[[AccountViewController alloc] initWithNibName:@"AccountViewController" bundle:nil] autorelease];
UIViewController *message = [[[MessageViewController alloc] initWithNibName:@"MessageViewController" bundle:nil] autorelease];
UIViewController *more = [[[MoreViewController alloc] initWithNibName:@"MoreViewController" bundle:nil] autorelease];
self.tabBarController = [[[UITabBarController alloc] init] autorelease];
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
if([prefs objectForKey:@"uid"]){
    self.tabBarController.viewControllers = @[popular, upcoming, account, message, more];
}else{
    self.tabBarController.viewControllers = @[popular, upcoming, more];
}
self.window.rootViewController = self.tabBarController;
[self.window makeKeyAndVisible];

Gdy użytkownik się wyloguje, wykonuję następujące czynności, które przenoszą mnie do trzech kart, usuwając Konto i Wiadomość, które powinny być widoczne tylko wtedy, gdy użytkownik jest zalogowany

NSMutableArray *tbViewControllers = [NSMutableArray arrayWithArray:[self.tabBarController viewControllers]];
[tbViewControllers removeObjectAtIndex:2];
[tbViewControllers removeObjectAtIndex:2];
[self.tabBarController setViewControllers:tbViewControllers];

Teraz na stronie więcej jest logowanie, więc jeśli nacisną, zostaną przeniesieni do nowego kontrolera widoku, aby się zalogować. jeśli zalogują się pomyślnie, wykonaj następujące czynności:

Wróć do widoku kart

[[self presentingViewController] dismissModalViewControllerAnimated:YES];

Następnie w widokuWillAppear

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
if([prefs objectForKey:@"uid"]){
  NSMutableArray *tbViewControllers = [NSMutableArray arrayWithArray:[self.tabBarController viewControllers]];
  [tbViewControllers removeObjectAtIndex:2];
  UIViewController *account = [[[AccountViewController alloc] initWithNibName:@"AccountViewController" bundle:nil] autorelease];
  UIViewController *message = [[[MessageViewController alloc] initWithNibName:@"MessageViewController" bundle:nil] autorelease];
  UIViewController *more = [[[MoreViewController alloc] initWithNibName:@"MoreViewController" bundle:nil] autorelease];
  [tbViewControllers addObject:account];
  [tbViewControllers addObject:message];
  [tbViewControllers addObject:more];
  [self.tabBarController setViewControllers:tbViewControllers];
}

Problem polega na tym, że znajdują się już na większej stronie, więc usunięcie obiektu w indeksie 2 powoduje usunięcie większej liczby stron, a tym samym powoduje awarię aplikacji, mimo że widzę 5 kart pojawiających się tuż przed awarią. Więc moje pytanie brzmi: jak mogę dodać dwie zakładki na środku bez usuwania kolejnej zakładki?

Dziękuję za pomoc!

5
user577732 29 wrzesień 2012, 22:03

2 odpowiedzi

Najlepsza odpowiedź

Skończyło się na przeniesieniu kodu do widokuWillAppear na pierwszej karcie, a kiedy muszę usunąć karty, ustawiam potrzebne zmienne i programowo przeskakuję do pierwszej karty, która następnie ustawia ją w razie potrzeby, a następnie programowo wracam do ostatnia karta, która nawet nie wyświetla się na telefonie.

Wydaje się trochę hakerskie, ale działa, ale na razie pozostanę otwarte, aby sprawdzić, czy są lepsze opcje, które na pewno istnieją

0
user577732 29 wrzesień 2012, 23:30

Jeśli spojrzysz na ten link, możesz znaleźć przykładowy kod, który wydaje się być właściwą ścieżką do rozwiązania problemu (w sekcji „Zarządzanie zakładkami w czasie wykonywania”). To jest spokój informacji z danego linku, którego potrzebujesz, podany tutaj dla uproszczenia:

...metoda usuwająca aktualnie wybraną kartę w odpowiedzi na dotknięcie określonego przycisku w tej samej karcie. Ta metoda jest zaimplementowana przez kontroler widoku dla karty. Możesz użyć czegoś podobnego we własnym kodzie, jeśli chcesz usunąć kartę, która nie jest już potrzebna. Na przykład możesz użyć go do usunięcia karty zawierającej niektóre dane specyficzne dla użytkownika, które należy wprowadzić tylko raz.

- (IBAction)processUserInformation:(id)sender
{
   // Call some app-specific method to validate the user data.
   // If the custom method returns YES, remove the tab.
   if ([self userDataIsValid])
   {
      NSMutableArray* newArray = [NSMutableArray arrayWithArray:self.tabBarController.viewControllers];
      [newArray removeObject:self];

      [self.tabBarController setViewControllers:newArray animated:YES];
   }
}

A także uwaga (tylko dla kompletności odpowiedzi):

...Jeśli dodajesz lub usuwasz karty w sposób, który może być widziany przez użytkownika, możesz animować zmiany kart za pomocą metody setViewControllers:animated:.

Mając to na uwadze, możesz utworzyć kontroler widoku logowania i dodać go do kontrolera paska kart. Następnie programowo wybierz tę kartę logowania (i ukryj sam pasek kart), a na koniec użyj metody, takiej jak przedstawiona, aby dodać/usunąć potrzebne karty i usunąć samą kartę logowania z własnego kontrolera widoku (jak pokazano w kodzie).

Mam nadzieję, że to pomoże ;)

P.s. Nie zweryfikowałem tego w kodzie...

0
Despotovic 14 czerwiec 2013, 21:42