pushViewController не работает с контроллером панели вкладок - PullRequest
2 голосов
/ 17 декабря 2011

Я пытаюсь вставить новый контроллер вида с кодом:

[self.navigationController pushViewController:webViewController animated:YES];

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

ОБНОВЛЕНИЕ

- (void)loadView {
    // Create an instance of UIWebView as large as the screen
    CGRect screenFrame = [[UIScreen mainScreen] applicationFrame];
    UIWebView *wv = [[UIWebView alloc] initWithFrame:screenFrame];
    // Tell web view to scale web content to fit within bounds of webview 
    [wv setScalesPageToFit:YES];

    [self setView:wv];
    [wv release];
}

ставит веб-представление как представление WebViewController

нетперо, как показано выше

метод ячейки didSelect ВЫЗЫВАЕТСЯ с использованием NSLog для определения

Все инициализировано и распределено и не равно нулю

ОБНОВЛЕНИЕ:

my did select method cell:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Push the web view controller onto the navigaton stack - this implicity
    // creates the web view controller's view the first time through

    NSLog(@"TOUCHED!");

    webViewController = [[WebViewController alloc] init];

    if (webViewController == nil) {
        NSLog(@"webViewController in nil state");
    }

    [self.navigationController pushViewController:webViewController animated:YES];


    // Grab the selected item
    RSSItem *entry = [[channel items] objectAtIndex:[indexPath row]];

    // Construct a URL with the link string of the item
    NSURL *url = [NSURL URLWithString:[entry link]];

    // Construct a request object with that URL
    NSURLRequest *req = [NSURLRequest requestWithURL:url];

    // Load the request into the web view
    [[webViewController webView] loadRequest:req];

    // Set the title of the web view controller's navigation item
    [[webViewController navigationItem] setTitle:[entry title]];

}

ВСЕ ЭТО РАБОТАЕТ ДО ВСТАВКИ КОНТРОЛЛЕРА TAB BAR

UPDATE

Где я создаю контроллеры (В ПРИЛОЖЕНИИ APP):

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

             self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    ListViewController *lvc = [[ListViewController alloc] initWithStyle:UITableViewStylePlain];

    [lvc autorelease];
    // Create the tabBarController
    UITabBarController *tabBarController = [[UITabBarController alloc] init];

    // Create two view controllers
    UIViewController *vc1 = [[ListViewController alloc] initWithStyle:UITableViewStyleGrouped];
    UIViewController *vc2 = [[YoutubeViewController alloc] init];

    // Make an array containing the two view controllers
    NSArray *viewControllers = [NSArray arrayWithObjects:vc1, vc2, nil];

    // The viewControllers array retains vc1 and vc2, we can release
    // our ownership of them in this method
    [vc1 release];
    [vc2 release];

    // Attach them to the tab bar controller
    [tabBarController setViewControllers:viewControllers];

    // Put the tabBarController's view on the window
    [[self window] setRootViewController:tabBarController];

    // The window retains tabBarController, we can release our reference
    [tabBarController release];

    // Show the window
    [[self window] makeKeyAndVisible];

    return YES;
}

Так что я действительно понятия не имею, что здесь происходит.Также если вы могли бы помочь мне с другим вопросом!Зайдите в мой профиль и увидите вопрос о том, как остановить обрезку / добавить дополнительную строку для текстовой метки в uitableviewcell

Ответы [ 4 ]

5 голосов
/ 18 декабря 2011

Я не вижу начальный UINavigationViewController в вашем делегате приложения.Чтобы использовать push.ViewViewController self.navigationController, контроллер представления должен находиться в одном из self.navigationController.viewControllers.Можете ли вы изменить свой код и попробовать следующее, и убедитесь, что он работает для вас.

// Create two view controllers
UIViewController *vc1 = [[ListViewController alloc] initWithStyle:UITableViewStyleGrouped];
UIViewController *vc2 = [[YoutubeViewController alloc] init];

// Create the UINavigationController and put the list view controller as the root view controller
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:vc1];

// Make an array containing the two view controllers and the UINavigationController which has the ListViewController is the first one.
NSArray *viewControllers = [NSArray arrayWithObjects:navController, vc2, nil];

// The viewControllers array retains vc1 and vc2, we can release
// our ownership of them in this method
[vc1 release];
[vc2 release];
[navController release];

// Attach them to the tab bar controller
[tabBarController setViewControllers:viewControllers];
2 голосов
/ 14 марта 2014

Если контроллер представления находится под кнопкой «Дополнительно», то все немного меняется.

Вот что мне помогло выяснить, какой контроллер навигации использовать:

- (void)application:(UIApplication *)app didReceiveLocalNotification:(UILocalNotification *)notif {
    UITabBarController *tabBar = (UITabBarController*) self.window.rootViewController;
    UINavigationController* navigationController = (UINavigationController*)self.tabBarController.selectedViewController;
    UIViewController* top = nil;
    if ([navigationController respondsToSelector:@selector(topViewController)]) {
        top = navigationController.topViewController;
    }

    // the actual current navigation controller depends on whether we are on a view under the More tab
    UINavigationController *curNavController;
    if (top == nil) {  // this implies a view under the More tab
        curNavController = tabBar.moreNavigationController;
    } else {
        curNavController = navigationController;
    }
    [[LocalNotificationMgr Get] ReceivedNotification:notif navController:curNavController];
}

По сути, если пользователь находится в представлении на вкладке «Дополнительно», фактический текущий UINavigationController, который вы хотите использовать для добавления UIViewController, является свойством moreNavigationController объекта UITabBarController. Если в представлении, фактически видимом на самой панели вкладок, используйте свойство selectedViewController UITabBarController. ПРИМЕЧАНИЕ: если вы находитесь на самом «дополнительном экране», вы можете использовать любое свойство.

2 голосов
/ 17 декабря 2011

Есть несколько пунктов, которые вы должны проверить, чтобы сделать успешный толчок.

Во-первых, контроллер представления, который должен быть выдвинут, вероятно, спроектирован и сохранен в файле NIB.Проверьте, как вы создаете его в своем коде, в частности, имя файла NIB (при условии, что вы используете -(id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle).Это должно быть реальное имя файла NIB без расширения NIB / XIB.

Во-вторых, инициировано ли событие выбора и действительно ли сообщение отправлено делегату табличного представления?Вы можете поставить некоторые записи, чтобы убедиться, что.Табличное представление не будет препятствовать тому, чтобы контроллер представления был помещен в стек навигации.

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

1 голос
/ 17 декабря 2011

Вы делали это так, как показано ниже?

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(reqList==Nil)
    {
        reqList = [[RequestList alloc]initWithNibName:@"RequestList" bundle:nil];
    }

            [self.navigationController pushViewController:reqList animated:YES];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...