Дважды нажмите на выбранный элемент панели вкладок, чтобы скрыть текущий контроллер представления

У меня возникли проблемы с отправкой представления с использованием стека навигации.

Проблема, с которой я сталкиваюсь, заключается в том, что после касания элемента панели вкладок контроллер представления помещается в стек навигации (из контроллера представления с именем FirstViewController) следующим образом:

- (void)viewDidLoad
{
    [super viewDidLoad];
    svc = [[SecondViewController alloc] init];
    [self.navigationController pushViewController:svc animated:YES];
}

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

Когда это происходит, текущий вид (SecondViewController, который был ранее нажат) удаляется, как будто я касаюсь кнопки «Готово».

Я не могу отследить, где и почему это происходит.

РЕДАКТИРОВАТЬ: Вот как я настроил панель вкладок, контроллеры просмотра и навигацию:

@implementation AppDelegate
@synthesize HomeViewController, FirstViewController, SecondViewController,     ThirdViewController, SettingsViewController, tabBarController, window;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    FirstViewController *firstViewController = [[FirstViewController alloc]
                                            initWithNibName:nil bundle:nil];
    UINavigationController *firstViewControllerNav = [[UINavigationController alloc]
                                      initWithRootViewController:firstViewController];

    SecondViewController *secondViewController = [[SecondViewController alloc]
                                             initWithNibName:nil bundle:nil];
    UINavigationController *secondViewControllerNav = [[UINavigationController alloc]
                                                      initWithRootViewController:secondViewController];

    ThirdViewController *thirdViewController = [[ThirdViewController alloc]
                                                  initWithNibName:nil bundle:nil];
    UINavigationController *thirdViewControllerNav = [[UINavigationController alloc]
                                                      initWithRootViewController:thirdViewController];

    self.tabBarController = [[UITabBarController alloc] init];
    self.tabBarController.viewControllers = @[firstViewControllerNav,
                                              secondViewControllerNav];

    UITabBar *tabBar = tabBarController.tabBar;

    UITabBarItem *tabBarItem1 = [tabBar.items objectAtIndex:0];
    UITabBarItem *tabBarItem2 = [tabBar.items objectAtIndex:1];

    [self.window setRootViewController:self.tabBarController];

    [self.window makeKeyAndVisible];

    return YES;
}

person Gastón Algaze    schedule 14.10.2013    source источник
comment
это viewDidLoad TabBarController? где кнопка готово?   -  person Kunal Balani    schedule 15.10.2013
comment
пожалуйста, поделитесь своим кодом в сенсорном событии tabBarItem или сенсорном делегате tabBarContoller, где бы ни была ваша логика push для контроллера первого представления?   -  person Kunal Balani    schedule 15.10.2013
comment
Привет, Кунал, это viewDidLoad FirstViewController — пустой класс UIView. (@interface FirstViewController : UIViewController) Также у меня нет никакого кода в событии касания, так как я программно добавляю все элементы управления в appDelegate didFinishLaunchingWithOptions.   -  person Gastón Algaze    schedule 15.10.2013
comment
так есть ли какой-нибудь код для выбора элемента панели вкладок?   -  person Kunal Balani    schedule 15.10.2013


Ответы (1)


Двойное прикосновение к элементу панели вкладок приведет к тому, что контроллер навигации вернется к корневому контроллеру представления. Это ожидаемое и встроенное поведение.

Чтобы предотвратить это, вам придется использовать tabBarController:shouldSelectViewController: метода Протокол UITabBarControllerDelegate.

Я считаю, что что-то вроде этого сделает свое дело:

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {
    return viewController != tabBarController.selectedViewController;
}
person trydis    schedule 14.10.2013
comment
Хорошо, есть ли способ переопределить это поведение? Должен ли я реализовать это по-другому? - person Gastón Algaze; 15.10.2013
comment
Я думаю, что это поведение для двойного нажатия, это другое событие, чем однократное нажатие на выбранный? - person Kunal Balani; 15.10.2013
comment
Спасибо за ответ, чтобы применить этот код, я должен реализовать собственный контроллер панели вкладок и добавить этого делегата, верно? - person Gastón Algaze; 15.10.2013
comment
@KunalBalani Он упоминает, что проблема возникает при повторном касании одного и того же элемента панели вкладок. - person trydis; 15.10.2013
comment
@GastónAlgaze Нет, просто установите делегата в UITabBarController и реализуйте метод. - person trydis; 15.10.2013
comment
@trydis, поэтому я должен сделать что-то вроде этого: \\@interface AppDelegate : UIResponder ‹UIApplicationDelegate, UITabBarControllerDelegate› - person Gastón Algaze; 15.10.2013
comment
Тогда ваш вопрос дублируется: stackoverflow.com/questions/6585899/ stackoverflow.com/questions/1849975/ - person Kunal Balani; 15.10.2013
comment
Спасибо @KunalBalani. Я исправил это, добавив код, предложенный trydis, и tabBarController.delegate = self в appDelegate didFinishLaunchingWithOptions. Извините, если это был дублирующийся вопрос, он действительно помог мне понять тему, я не знал терминов, применимых к этому, например, popToRootViewController, возможно, это может помочь и другим. - person Gastón Algaze; 15.10.2013