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

мой проект содержит контроллер навигации и сегментированный элемент управления (с отдельным контроллером представления: segmentManagingViewController) программно, и теперь я добавил панель вкладок в IB... при вызове контроллера панели вкладок и контроллера навигации представление segmentManagingViewController загружается дважды... как в элементе панели вкладок1, так и в первом сегменте я назвал представление segmentManagingViewController....

вот скриншот моего приложения

снимок экрана

и ниже приведен метод приложения didFinishLaunchingWithOptions... пожалуйста, помогите мне решить эту проблему...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    databaseName = @"breadworks.sql";

    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [documentPaths objectAtIndex:0];
    databasePath = [documentsDir stringByAppendingPathComponent:databaseName];


    [self checkAndCreateDatabase];
    [self readBreadsFromDatabase];
    [self categoryFromDatabase];
    SegmentManagingViewController * segmentManagingViewController = [[SegmentManagingViewController alloc] init];
    self.navigationController = [[UINavigationController alloc] initWithRootViewController:segmentManagingViewController];
    [segmentManagingViewController release];

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


    return YES;
}

person iMeMyself    schedule 22.03.2012    source источник


Ответы (2)


Ваш код звучит странно для меня.

Во-первых, поскольку вы используете UITabBarController, установите его как rootViewController для вашего окна.

Затем установите UINavigationController в качестве дочернего контроллера вашего контроллера панели вкладок.

Наконец, как и вы, установите rootViewController для вашего UINavigationController на segmentManagingViewController.

Теперь, поскольку я предпочитаю делать это без xib, вы можете сделать следующее.

UITabBarController* tabBarController = [[UITabBarController alloc] init];

SegmentManagingViewController * segmentManagingViewController = [[SegmentManagingViewController alloc] init];
UINavigationController* navigationController = [[UINavigationController alloc] initWithRootViewController:segmentManagingViewController];

tabBarController.viewControllers = [NSArray arrayWithObjects:navigationController, nil];    

self.window.rootViewController = tabBarController;
[self.window makeKeyAndVisible];

//- only if you don't use ARC -----
[segmentManagingViewController release];
[navigationController release];
[tabBarController release];
//----------------------------------

return YES;

Если не используете ARC, обратите внимание на управление памятью!!

Надеюсь, поможет.

person Lorenzo B    schedule 22.03.2012
comment
спасибо flex, пытаясь понять предложенное вами решение, я исправил свою проблему... - person iMeMyself; 28.03.2012
comment
Без проблем. Если вы хотите, вы можете проголосовать, если сочтете это полезным. С уважением. - person Lorenzo B; 28.03.2012

Я объявил контроллер навигации и контроллеры представления (которые используются как объекты NSArray) в делегате и создал конструктор initWithNibName для контроллеров представления (определяющий заголовок, изображение и другие свойства TabBarItems).. вот обновленные фрагменты кода..

UIViewController *viewController1 = [[AtoZSecondviewController alloc] initWithNibName:@"AtoZSecondviewController" bundle:nil];
UIViewController *viewController2 = [[CategorySecondViewController alloc] initWithNibName:@"CategorySecondViewController" bundle:nil];

  tabBarController.viewControllers = [NSArray arrayWithObjects:navigationController,viewController1 ,viewController2, nil];  

Ниже приведено определение initWithNibName в ViewControllers.

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    if (self) {
        self.title = NSLocalizedString(@"Catogaries", @"Catogaries");
        self.tabBarItem.image = [UIImage imageNamed:@"TodaysChoice"];
    }
    return self;
}
person iMeMyself    schedule 28.03.2012