UITabBarController с UIPopOverController с несколькими представлениями - PullRequest
1 голос
/ 06 февраля 2012

Я работаю над небольшим приложением, в соответствии с требованием приложение должно иметь tabBarItem с 3 элементами. Для этого я программно создал tabBarController в файле AppDelegate.m и добавил 3 разных viewControllers, создал их и все работает хорошо. Я вижу tabBarItems и все представления работают. В одном из представлений, скажем, в SecondViewController я показываю popOverController, где я использовал UITableView, и заполняю его элементами. Когда я щелкаю один из элементов, он должен показывать другой вид, скажем, sendFeedback. Пока все не работает нормально, но как только этот sendFeedback представлен как модальное представление, он занимает все приложение, то есть скрывает tabBarItem.

Я представляю важные фрагменты кода здесь для обзора:

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.

    UIViewController *viewController1 = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
    viewController1.title = @"First";              

    UIViewController *viewController2 = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
    viewController2.title = @"Second";

    UITableViewController *tableView3 = [[tableViewController alloc]initWithNibName:@"tableViewController" bundle:nil];
    tableView3.title = @"Third";

    self.tabBarController = [[UITabBarController alloc] init];
    self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, tableView3 ,nil];
    self.tabBarController.delegate = self;
    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];

    [viewController1 release];
    [viewController2 release];
    [tableView3 release];

    return YES;
}

В моем файле popOverViewController.m я проверяю, какая строка выбрана в таблице в соответствии с тем, как я представляю представление

#pragma mark - TableView Delegate Methods

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{        

    sendFeedback *sendEmailViewController = [[sendFeedback alloc]initWithNibName:@"sendFeedback" bundle:nil];

    downLoad *downloadFilelViewController = [[downLoad alloc]initWithNibName:@"downLoad" bundle:nil];

    if (indexPath.row == 0)
        [self presentModalViewController:sendEmailViewController animated:YES];
   else
        [self presentModalViewController:downloadFilelViewController animated:YES];

}

Может кто-нибудь подсказать мне, как преодолеть это с помощью нескольких представлений. Если кому-то понадобится дополнительная информация с моей стороны, я с радостью предоставлю.

ПРИМЕЧАНИЕ: то же самое относится и к другому представлению (downLoad)

РЕДАКТИРОВАТЬ: Вот как я инициализирую мой PopOverController в файле AppDelegate.m

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController

{
    if([viewController isKindOfClass:[SecondViewController class]]){

        NSInteger index = [[self tabBarController] selectedIndex];

        CGRect buttonFrame = [[[[[self tabBarController] tabBar] subviews] objectAtIndex:index+1] frame];

        PopOverViewController *popoverView = [PopOverViewController new];       

        popoverView.contentSizeForViewInPopover = CGSizeMake(250, 85);

        popover = [[UIPopoverController alloc]initWithContentViewController:popoverView];

        NSLog(@"X:%f Y:%f",buttonFrame.origin.x,buttonFrame.origin.y);        

        [popover presentPopoverFromRect:buttonFrame inView:self.tabBarController.tabBar permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];        
    }

Спасибо

1 Ответ

0 голосов
/ 06 февраля 2012

Модальные контроллеры вида используются, чтобы «заблокировать» ваше приложение и выполнить задачу, прежде чем вы сможете продолжить.Таким образом, контроллеры модального представления - это не то, что вы хотите использовать.

Вместо этого оберните ваши контроллеры, которые должны отображаться во всплывающем окне в контроллере навигации.В tableView: didSelectRowAtIndexPath: метод вы можете поместить соответствующий контроллер представления в стек навигации.

Для решения вашей проблемы: В месте, где вы создаете popovercontroller, инициализируйте его с новым UINavigationController.И контроллер навигации вы должны инициализировать с помощью контроллера rootview, а именно PopOverViewController.m.

PopOverController *popoverContentController = [[PopOverController alloc] init];
UINavigationController *navcon = [[UINavigationController alloc] initWithRootViewController:popoverContentController];
popoverController = [[UIPopoverController alloc] initWithContentViewController:popoverContentController];

И в PopOverController.m

if (indexPath.row == 0)
    [self.navigationController pushViewController:sendEmailViewController animated:YES];
else
     [self.navigationController pushViewController:downloadFilelViewController animated:YES];
...