标签: uinavigationcontroller

UINavigationController popToRootViewController,然后立即推送一个新视图

我有一个带有两个选项卡的tabBarController,其中第一个包含NavigatorController的实例.navigatorController是使用自定义viewController"peersViewController"启动的,它列出了tableView上的所有网络对等体.选择对等体后,"FilesListViewController"(将c:\目录中的列表文件)的实例推送到navigationController堆栈中.

在这个filesListViewController中我有一个按钮让它导航到说文档目录.为此,我连接了接口以在rootViewController中调用gotoDirectory:(NSString*)路径方法:

- (void)gotoDirectory:(NSString*)path {
     [[self navigationController] popToRootViewControllerAnimated:YES];
     NSArray *files = [self getFilesFromPeerAtPath:path];
     FilesListViewController *filesVC = [[FilesListViewController alloc] initWithFiles:files];
     [[self navigationController] pushViewController:filesVC animated:YES];
     [filesVC release];
}
Run Code Online (Sandbox Code Playgroud)

但是,当我按下该按钮时,navigationController确实将我的视图弹出到根视图控制器,但是我实例化的FilesListViewController没有出现.从日志中,我知道确实调用了自定义initWithFiles方法,并且确实发生了网络内容以获取文件名.

关于此,还有其他一些问题.我尝试点击第二个标签,然后点击返回第一个标签,然后点击!我需要的文件名就在那里.看起来数据和filesListViewController确实被推入了navigatorController堆栈,但显示没有刷新,而是停留在rootViewController(peersViewController)的屏幕上.

我做错了吗?

--Ben.

- 在发布问题后15分钟编辑.我找到了一个解决方法,但是让我困扰的是pop然后推不起作用.

- (void)gotoDirectory:(NSString*)path {
     PeersListViewController *rootViewController = (PeersListViewController*)[[[self navigationController] viewControllers] objectAtIndex:0];
     [[self navigationController] setViewControllers:[NSArray arrayWithObject:rootViewController]];
     FilesListViewController *filesVC = [[FilesListViewController alloc] initWithFiles:files];
     [[self navigationController] pushViewController:filesVC animated:YES];
     [filesVC release];
}
Run Code Online (Sandbox Code Playgroud)

似乎应该以这种方式规避navigationController,我可能不得不释放原始堆栈中的所有viewControllers.但这确实适用于iphone 3.0模拟器.

如果我正在使用此代码,应如何处理内存释放?我应该获得原始的NSArray视图控制器并释放所有内容吗?

iphone uinavigationcontroller

23
推荐指数
2
解决办法
4万
查看次数

处理容器控制器中子视图控制器的UINavigationItem更改的最佳实践?

假设我有一个容器控制器,它接受一个UIViewControllers数组并将它们放置出去,这样用户就可以左右滑动以在它们之间进行转换.此容器控制器包含在导航控制器内,并成为应用程序主窗口的根视图控制器.

每个子控制器向API发出请求并加载在表视图中显示的项列表.根据显示的项目,可以在导航栏中添加一个按钮,允许用户对表格视图中的所有项目进行操作.

因为UINavigationController仅使用其子视图控制器的UINavigationItems,所以容器控制器需要更新其UINavigationItem以与其子视图的UINavigationItem同步.

容器控制器需要处理两种情况:

  1. 容器控制器的选定视图控制器发生更改,因此容器控制器的UINavigationItem应更新自身以模仿所选视图控制器的UINavigationItem.
  2. 子控制器更新其UINavigationItem,并且必须使容器控制器知道更改并更新其UINavigationItem以匹配.

我提出的最佳解决方案是:

  1. 在setSelectedViewController:方法中查询所选视图控制器的导航项,并将容器控制器的UINavigationItem的leftBarButtonItems,rightBarButtonItems和title属性更新为与所选视图控制器的UINavigationItem相同.
  2. 在setSelectedViewController方法中,KVO到leftBarButtonItems,rightBarButtonItems和所选视图控制器的UINavigationItem的title属性,每当其中一个属性改变容器控制器的UINavigationItem时.

这是我编写的许多容器控制器的一个反复出现的问题,我似乎找不到任何有关这些问题的文档解决方案.

人们对这个问题有什么解决方案?

cocoa-touch uinavigationcontroller uinavigationitem ios

23
推荐指数
2
解决办法
5283
查看次数

iOS:无法将UISplitViewController推送到UINavigationController

我有一个使用导航控制器的XCode iPad项目.我试图获得一个按钮将UISplitViewController推送到导航堆栈,但是出现了这个错误:

拆分视图控制器无法推送到导航控制器

原来UISplitViewController不能很好地与UINavigationController一起使用.但是,单击此按钮时,我仍需要显示拆分视图控制器.我该怎么做呢?而且,同样重要的是,如何制作一个后退按钮,以便用户可以返回到导航控制器?

uinavigationcontroller uisplitviewcontroller ios ios5

22
推荐指数
1
解决办法
1万
查看次数

UINavigationController - 在所有视图中保留背景图像

有没有办法让背景图像在导航控制器中的所有视图中保持不变?目前我在每个视图的viewDidLoad方法中加载相同的背景但这显示了从视图导航到视图时的背景图像移动.我宁愿只在该视图的内容 /关闭屏幕上的背景"幻灯片"的,但背景留固定.这是我当前的背景图片加载代码:

UIImageView *background = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];
background.image = [UIImage imageNamed:@"InfoBackground.png"];
[self.view addSubview:background];
[self.view sendSubviewToBack:background];
[background release];
Run Code Online (Sandbox Code Playgroud)

谢谢!

iphone uinavigationcontroller ios

22
推荐指数
1
解决办法
1万
查看次数

如何动态调整导航栏中的标题大小

我有一些显示在导航控制器中的视图.其中两个视图的导航栏标题较长.

问题是,当标题太长而不适合时,某些字符会被截断并添加"...".

有什么办法我可以告诉导航栏自动重新调整标题文本的大小以适应吗?

iphone resize uinavigationbar uinavigationcontroller autoresize

22
推荐指数
2
解决办法
2万
查看次数

在iOS7中测试的UINavigationBar设置tintcolor无法正常工作?

我有一个应用程序有一个UINavigationBar,我已将色调颜色设置为黑色,如下所示:

self.navigationController.navigationBar.tintColor = [UIColor blackColor];`
Run Code Online (Sandbox Code Playgroud)

我在IOS 6测试了它,它是黑色的.但是,当我在iOS 7中尝试使用相同的应用程序时,它显示为默认导航栏.

正如标题所说,它不起作用吗?

iphone objective-c uinavigationcontroller tintcolor ios7

22
推荐指数
3
解决办法
3万
查看次数

继续获得"对<ViewController>开始/结束外观转换的不平衡调用"错误

我有一个几乎完美运行的应用程序.以下是我的应用程序的结构:

故事板上共有6个视图控制器.前3个视图控制器是最重要的.初始视图控制器具有"登录"和"注册"按钮."登录"按钮以模态方式呈现登录视图控制器,"注册"按钮以模态方式呈现注册视图控制器.

注册视图控制器有3个用户名,密码和电子邮件字段,然后是"提交"按钮.提交按钮将数据提交给我的Web服务器,如果所有内容都成功提交,则会调用"performSegueWithIdentifier"方法.

这是声明:

[self performSegueWithIdentifier:@"superSegue" sender:self];
Run Code Online (Sandbox Code Playgroud)

我今晚花了2个小时试图让上面的方法调用工作,它最终确实有效.为了让它工作,我不得不在故事板上选择我的注册视图控制器并转到编辑器>嵌入>导航控制器(如果我没记错的话,我必须这样做,因为注册视图控制器是以模态方式呈现的).然后我从我的注册视图控制器的提交按钮拖到我想要推送到的视图控制器并选择了推送,然后键入标识符名称.

无论如何,以上所有工作完全正常,直到我尝试使用我们推送到使用方法调用的View Controller上的后退按钮.如果我点击后退按钮,它会进入90%的黑色屏幕,顶部有一个空白的导航栏,后面有一个按钮,当然后面按钮也没有任何效果.

这是我在控制台中收到的错误:

Unbalanced calls to begin/end appearance transitions for <VerificationViewController: 0x14ed1bb0>
Run Code Online (Sandbox Code Playgroud)

验证视图控制器是注册视图控制器通过performSegueWithIdentifier方法推送的视图控制器.

有谁知道如何解决这个错误?

我在下面列出了我的故事板在xcode中的样子.有一个我已经编码但尚未连接的视图控制器,不管怎样都不应该有所不同,所以你可以忽略Login VC右侧的View Controller.

在此输入图像描述

objective-c uiviewcontroller uinavigationcontroller ios segue

22
推荐指数
2
解决办法
4万
查看次数

将navigationBar背景图像设置为[UIImage new]后恢复

我需要一个完全透明的mapView导航栏,所以我这样做:

[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
[self.navigationController.navigationBar setShadowImage:[UIImage new]];
Run Code Online (Sandbox Code Playgroud)

这会返回所需的效果,如下所示:

在此输入图像描述

现在,当我去其他任何地方时我遇到了问题,因为我的navigationBar仍然是透明的:

在此输入图像描述

如何恢复navigationBar的backgroundImage和shadowImage的默认设置?

objective-c uinavigationbar uinavigationcontroller ios

22
推荐指数
2
解决办法
9704
查看次数

在iOS 8中按下/弹出视图时显示/隐藏navigationBar

嗨其他开发者,

我很惊讶我没有找到关于iOS 8特定用例的任何信息.让我解释一下,我有一个导航控制器堆栈,第一个视图隐藏了它的navigationBar,当用户点击一个单元格的新视图时被推,我需要这个视图上显示的导航栏返回(显然).在iOS 7上,只需在viewWillAppear中添加此行:

 [self.navigationController setNavigationBarHidden:NO animated:YES];
Run Code Online (Sandbox Code Playgroud)

它就像一个魅力.但是从iOS 8开始,我很难有同样的行为.现在我设法通过使用:

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0"))
        [self.navigationController setNavigationBarHidden:NO animated:NO];
}
- (void)viewDidLoad {
     [super viewDidLoad];
     if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {
         self.automaticallyAdjustsScrollViewInsets = NO;
         self.edgesForExtendedLayout = UIRectEdgeNone;
         self.collectionView.contentInset = UIEdgeInsetsMake(self.navigationController.navigationBar.frame.size.height, 0, 0, 0);
}    }
Run Code Online (Sandbox Code Playgroud)

并更改我需要显示的collectionsView/tableviews的contentInset.它会起作用,但它在*中是一个真正的痛苦(如果用户来自新的viewcontroller,有时内容插入是不必要的).

对于上下文,项目最初是为处理iOS 6和7而开发的,所以没有故事板,所有都是以编程方式完成的.我将应用程序移植到更现代的代码库中并使其具有通用性.

我错过了什么吗?在iOS 7/8中有更好的方法来处理它吗?

uinavigationbar uinavigationcontroller ios ios7 ios8

22
推荐指数
4
解决办法
2万
查看次数

UINavigationBar在推送时改变颜色

UINavigationBar在不同的视图中使用了2种不同的条纹色调.我在两个视图中都用这种方法改变了颜色:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.barTintColor = COLOR
}
Run Code Online (Sandbox Code Playgroud)

当我点击后退按钮时,颜色没有顺利改变(你可以看到最后一秒闪烁).

视觉错误

但是如果只是向后滑动视图而不是点击后退按钮,一切都会好的.

没有视觉错误

如何在两种情况下顺利过渡?

uinavigationbar uinavigationcontroller ios swift

22
推荐指数
2
解决办法
6217
查看次数