pushViewController 不能与标签栏控制器一起使用
Posted
技术标签:
【中文标题】pushViewController 不能与标签栏控制器一起使用【英文标题】:pushViewController not working with tab bar controller 【发布时间】:2011-12-17 13:07:19 【问题描述】:我正在尝试使用代码推入一个新的视图控制器:
[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];
将 web 视图作为 WebViewController 的视图
没有如上所示的笔尖
使用 NSLog 调用 didSelect 单元格方法
一切都被初始化和分配并且非零
更新:
我确实选择了单元格方法:
-(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]];
在插入标签栏控制器之前,所有这些都已正常工作
更新
我在哪里创建控制器(IN APP DELEGATE):
- (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 中停止截断/为文本标签添加额外行的问题
【问题讨论】:
【参考方案1】:我没有在您的应用委托中看到初始 UINavigationViewController。为了使用 self.navigationController pushViewController,视图控制器需要位于 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】:为了使推送成功,您必须检查几点。
首先,要推送的视图控制器可能被设计并存储在一个NIB文件中。检查您如何在代码中创建它,尤其是 NIB 文件名(假设您使用 -(id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle
)。它必须是没有 NIB/XIB 扩展名的真实 NIB 文件名。
其次,是否触发了选择事件并将消息真正发送到表视图委托?您可以放置一些日志记录以确保这一点。表格视图不会阻止视图控制器被推送到导航堆栈上。
关于如何/在何处创建该控制器的问题并不十分精确,所以最后,如果这些都不起作用,请在推送之前进行测试以分配/初始化控制器。您可能对正在发生的事情有更好的了解。
【讨论】:
不,它不是笔尖,它是一个网络视图,我在 loadView 方法中这样做: - (void)loadView // 创建一个与屏幕一样大的 UIWebView 实例 CGRect screenFrame = [[UIScreen mainScreen] applicationFrame]; UIWebView *wv = [[UIWebView alloc] initWithFrame:screenFrame]; // 告诉 web view 缩放 web 内容以适应 webview [wv setScalesPageToFit:YES]; [自我设置视图:wv]; [wv 发布];然后我将请求加载到其他地方,使用 nslog 调用 didSelect 单元方法 但它不必是笔尖,在我放入标签栏控制器之前,它可以在没有笔尖的情况下使用【参考方案3】:如果视图控制器位于“更多”按钮下,那么情况会有所改变。
以下是让我弄清楚要使用哪个导航控制器的方法:
- (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];
基本上,如果用户在更多选项卡下的视图上,您想要用来将 UIViewController 推送到的实际当前 UINavigationController 是 UITabBarController 的 moreNavigationController 属性。 如果在选项卡栏本身上实际可见的视图上,请使用 UITabBarController 的 selectedViewController 属性。 注意:如果您在“更多屏幕”本身,您可以使用任一属性。
【讨论】:
请注意,“top”可以很容易地替换为一个普通的布尔值,指示是否响应选择器。无论如何,您的解决方案对我有用。非常感谢!【参考方案4】:你是按照下面的方式做的吗??
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
if(reqList==Nil)
reqList = [[RequestList alloc]initWithNibName:@"RequestList" bundle:nil];
[self.navigationController pushViewController:reqList animated:YES];
【讨论】:
但我在另一个地方初始化了它,所以它非零/非零,它仍然不起作用 你的视图设置是什么?您是否将 UINavigationController 作为根视图控制器,并且在视图中您有标签栏控制器,或者标签栏控制器是根视图控制器,并且其中一个标签项是 uinavigationController? 我将标签栏控制器作为根视图控制器我将两个视图控制器(一个表视图和一个视图控制器)的数组设置为标签栏控制器的视图控制器。在两个视图控制器的 init 和 initWithStyle 方法中,我制作了一个 uibaritem。以上是关于pushViewController 不能与标签栏控制器一起使用的主要内容,如果未能解决你的问题,请参考以下文章
从 App Delegate 调用时,PushViewController 不起作用
pushViewController 在多个标签应用程序中啥都不做?
当多个tableViewControllers(没有故事板)时如何pushViewController
透明 ViewController 可与 presentViewController 一起使用,但不能与 pushViewController 一起使用