Загрузка контроллера навигации дважды, как решить эту проблему? - PullRequest
0 голосов
/ 22 марта 2012

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

Вот снимок экрана моего приложения

screen shot

, а далее - метод 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;
}

Ответы [ 2 ]

1 голос
/ 28 марта 2012

Я объявил контроллер навигации и контроллеры представления (которые используются в качестве объектов NSArray) в делегате и создал Конструктор initWithNibName для контроллеров представления (определяя Title, Image и другие свойства 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;
}
1 голос
/ 22 марта 2012

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

Во-первых, поскольку вы используете 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, обратите внимание на управление памятью !!

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

...