Как я могу "сбросить" панель вкладок в приложении iPhone - PullRequest
8 голосов
/ 03 декабря 2010

У меня есть приложение для iPhone: когда вы открываете приложение, вы видите «LoginView».Если вы войдете в приложение, вы увидите TabBarController.На третьей и последней вкладке есть кнопка «Выход».Если вы нажмете, вы увидите «LoginView» снова.Моя проблема в том, что при повторном входе в систему вы видите «старую» вкладку, а выбранная вкладка является третьей, а не одной, и есть кнопка «Выход».Кроме того, если пользователь входит в систему с другим пользователем, просмотрите старые данные предыдущего пользователя (очень опасно).

Вот код: - Delegate.h:

UITabBarController *tabBarController;
LoginViewController *loginView;

- Делегат.m (didFinishLaunchingWithOptions):

[self.window makeKeyAndVisible];

loginView = [[LoginViewController alloc] init];

if (YES) { /* if the user is not already logged */
    [self.window addSubview:loginView.view];
}

Delegate.m (методы):

- (void)loginComplete {
    [loginView dismissModalViewControllerAnimated:YES];
    [window addSubview:tabBarController.view];
}

- (void)logoutComplete {
    [[tabBarController view] removeFromSuperview];
    [tabBarController release];
    [window addSubview:loginView.view];
}

А вот два метода в двух разных контроллерах представления:

- (IBAction)login:(id)sender {

     TabNavisAppDelegate *delegate =
      (TabNavisAppDelegate *) [[UIApplication sharedApplication] delegate];
  [delegate loginComplete];
  }

(метод выхода такой же)

Ребята, как мне решить эту болезненную проблему?Итак, вот список приложений, которые делают то, что я хочу: «Foursquare», «Brightkite» и другие.У каждого из них есть экран входа в систему, представление панели вкладок и кнопка выхода из системы.

Спасибо @ всем.

Ответы [ 4 ]

10 голосов
/ 03 декабря 2010

Для ситуаций входа в систему, выхода из системы и входа в систему, когда все виды вещей должны сбрасываться самостоятельно при выходе из системы или при следующем входе в систему, мне нравится создавать уведомления, что-то вроде «NewUserReset». Все, что нужно для сброса себя в исходное состояние, прослушивает уведомление и запускает метод, который выполняет любой вид сброса, в котором он нуждается. Панель вкладок изменит название кнопки на выход из системы, временные структуры данных nil / zero / release сами и т. Д.

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

Отправка уведомления очень проста. Когда пользователь нажимает кнопку «Выйти», вы отправляете уведомление следующим образом:

[[NSNotificationCenter defaultCenter] postNotificationName:@"JMUserLogout" 
                                                object:nil];

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

Когда это уведомление исчезнет, ​​любой объект, зарегистрированный в defaultCenter для прослушивания @ "JMUserLogout", будет выполнять любые действия, которые вы выберете. Вот как регистрируется ваш объект (он должен находиться в каком-то месте, например, в ViewWillLoad или в методе инициализации объекта):

[[NSNotificationCenter defaultCenter] addObserver:self 
                                     selector:@selector(resetForNewUser:)
                                         name:@"JMUserLogout"
                                       object:nil];

Селектор там, resetForNewUser:, это просто имя метода, который вы хотите запустить, когда уведомление исчезнет. Этот метод выглядит так:

- (void)resetForNewUser:(NSNotification *)notif {
    // DO SOMETHING HERE
}

Там, где написано // ЧТО-ТО ЗДЕСЬ, вы добавите код, специфичный для вашего приложения. Например, вы можете добавить панель вкладок в качестве наблюдателя уведомления JMUserLogout. В методе resetForNewUser: вы бы изменили имя кнопки выхода на «Вход».

В ViewController или View или хранилище данных, в котором хранятся старые данные предыдущего пользователя, метод resetForNewUser удалит все эти данные и вернет их так, как они должны быть для нового пользователя. Например, если предыдущий пользователь ввел данные в UITextField, вы удалили бы текст, yourTextFieldName.text = @ "";

Наконец, важно также удалить свой объект в качестве наблюдателя, прежде чем он будет освобожден. В вашем методе Dealloc для каждого объекта, который зарегистрировался для получения уведомления, вы добавляете следующее:

[[NSNotificationCenter defaultCenter] removeObserver:self];

Надеюсь, это имеет смысл. Документация Apple для NSNotificationCenter объясняет больше и предоставляет несколько примеров приложений, использующих уведомления.

0 голосов
/ 24 октября 2015

Если вы хотите сбросить старые данные предыдущего пользователя после выхода из системы ... все, что вам нужно сделать, - сбросить свойство viewControllers UITabBarController.

Так что если вы создаете подклассыUITabBarController следующий код должен восстановить ваше приложение в исходное состояние.

    self.viewControllers = @[self.viewControllerOne, self.viewControllerTwo, self.viewControllerThree];

Из документации:

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

0 голосов
/ 03 декабря 2010

Возможно, объект tabBarController где-то был сохранен. Попробуйте удалить это.

И используйте следующий код для методов входа в систему, выхода из системы

- (void)loginComplete {

    // initialize the tabBarController here. like the following
    if(tabBarController == nil){
    tabBarController = [[UITabBarController alloc] init];

    }
    [loginView dismissModalViewControllerAnimated:YES];
    [window addSubview:tabBarController.view];
}

- (void)logoutComplete {
    [[tabBarController view] removeFromSuperview];
    [tabBarController release];
    tabBarController = nil;
    [window addSubview:loginView.view];
}

Так что ваша проблема будет решена.

0 голосов
/ 03 декабря 2010

Похоже, что tabBarController не выпускается.[retain count должен быть 1 до освобождения] tabBarController может быть сохранен где-то.проверьте его количество.

...