我有一个理论问题.现在我正在阅读Apple的ViewController指南.
他们写:
当需要关闭呈现的视图控制器时,首选方法是让呈现视图控制器关闭它.换句话说,只要有可能,呈现视图控制器的同一视图控制器也应负责解除它.尽管有几种技术用于通知呈现视图控制器应该解除其呈现的视图控制器,但是优选的技术是委托.
但我无法解释,为什么我必须在呈现的VC中创建一个协议并添加委托变量,在呈现VC中创建委托方法以解除所呈现的VC,而不是在呈现的视图控制器方法中的简单调用
[self dismissViewControllerAnimated:NO completion:nil]?
为什么第一选择更好?为什么Apple推荐它?
我需要一个根视图控制器的实例.
我试过这些方法:
UIViewController *rootViewController = (UIViewController*)[[[UIApplication sharedApplication] keyWindow] rootViewController];
Run Code Online (Sandbox Code Playgroud)
返回: null:
当我尝试获得一组控制器时:
NSArray *viewControllers = self.navigationController.viewControllers;
Run Code Online (Sandbox Code Playgroud)
它只返回一个控制器,但它不是我的根视图控制器.
如果我尝试从导航控制器:
UIViewController *root = (UIViewController*)[self.navigationController.viewControllers objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)
返回: null:
有什么想法吗?还有什么我可以尝试获取我的根视图控制器的实例?
谢谢.
objective-c uiviewcontroller uinavigationcontroller ios5 swift
我只是第一次踏入iOS开发阶段,而我必须要做的第一件事就是实现一个自定义的容器视图控制器 - 让我们调用它SideBarViewController- 交换出几个可能的子视图控制器中的哪一个显示,几乎完全像标准的标签栏控制器.(它几乎是一个标签栏控制器,但有一个可隐藏的侧面菜单而不是标签栏.)
根据Apple文档中的说明,addChildViewController每当我将一个子ViewController添加到我的容器时,我都会调用它.用于交换当前子视图控制器的代码如下所示SideBarViewController:
- (void)showViewController:(UIViewController *)newViewController {
UIViewController* oldViewController = [self.childViewControllers
objectAtIndex:0];
[oldViewController removeFromParentViewController];
[oldViewController.view removeFromSuperview];
newViewController.view.frame = CGRectMake(
0, 0, self.view.frame.size.width, self.view.frame.size.height
);
[self addChildViewController: newViewController];
[self.view addSubview: newViewController.view];
}
Run Code Online (Sandbox Code Playgroud)
然后我开始试图弄清楚addChildViewController这里有什么,我意识到我不知道.除了ViewController在.childViewControllers阵列中粘贴新内容外,它似乎对任何东西都没有影响.从孩子控制器的视图到我在故事板上设置的子控制器的操作和出口仍然可以正常工作,即使我从不打电话addChildViewController,我无法想象它还能影响到什么.
事实上,如果我重写我的代码不打电话addChildViewController,而是看起来像这样......
- (void)showViewController:(UIViewController *)newViewController {
// Get the current child from a member variable of `SideBarViewController`
UIViewController* oldViewController = currentChildViewController;
[oldViewController.view removeFromSuperview];
newViewController.view.frame = CGRectMake( …Run Code Online (Sandbox Code Playgroud) 我正在设置我的视图控制器标题,在视图中加载:
self.title = @"my title";
Run Code Online (Sandbox Code Playgroud)
在此之前,我在故事板中为其嵌入的视图控制器和导航控制器设置标题.我将其设置为:"标题";
当我单击保持视图控制器的选项卡标签栏项目的标题并uiviewcontroller更改为:我的标题
我想让视图控制器更改,但标签栏项目保留标题:标题
我怎么能做到这一点?
有人能指出我创建自定义视图控制器作为容器视图控制器的任何好例子吗?我能找到的唯一文档是UIViewController类参考中的几个段落.我觉得我需要比这更多的信息,一个示例实现会很好.谷歌根本没有发现任何事情.
我对这个方法特别感兴趣:
transitionFromViewController:toViewController:duration:options:animations:completion:
Run Code Online (Sandbox Code Playgroud) 在调查内存泄漏时,我发现了一个与setRootViewController:在转换动画块中调用技术相关的问题:
[UIView transitionWithView:self.window
duration:0.5
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^{ self.window.rootViewController = newController; }
completion:nil];
Run Code Online (Sandbox Code Playgroud)
如果旧视图控制器(正在替换的视图控制器)当前正在呈现另一个视图控制器,则上述代码不会从视图层次结构中删除呈现的视图.
也就是说,这一系列操作......
transitionWithView:使Z中的新根视图控制器...对用户看起来没问题,但Debug View Hierarchy工具将显示Y的视图仍然在Z的视图后面,在a UITransitionView.也就是说,在上面的三个步骤之后,视图层次结构是:
我怀疑这是一个问题,因为在转换时,X的视图实际上不是视图层次结构的一部分.
如果我dismissViewControllerAnimated:NO之前发送到X transitionWithView:,则生成的视图层次结构为:
如果我向dismissViewControllerAnimated:X 发送(是或否),然后在completion:块中执行转换,则视图层次结构正确.不幸的是,这会干扰动画.如果动画解雇,那就浪费时间; 如果没有动画,它看起来很破碎.
我正在尝试其他一些方法(例如,创建一个新的容器视图控制器类作为我的根视图控制器),但没有找到任何有效的方法.我会去的时候更新这个问题.
最终目标是直接从呈现视图转换到新的根视图控制器,而不会留下杂散视图层次结构.
我有一些奇怪的行为presentViewController:animated:completion.我所做的实际上是一个猜谜游戏.
我有一个UIViewController(frequencyViewController)包含一个UITableView(frequencyTableView).当用户点击包含正确答案的questionTableView中的行时,视图(correctViewController)应该是实例化的,并且其视图应该从屏幕底部向上滑动,作为模态视图.这告诉用户他们有正确的答案并重置其背后的frequencyViewController,准备好接下来的问题.按下按钮时,correctViewController被解除以显示下一个问题.
这一切都可以正常工作,只要presentViewController:animated:completion有正确的ViewController视图就会立即出现animated:NO.
如果我设置animated:YES,则初始化correctViewController并进行调用viewDidLoad.但是viewWillAppear,viewDidAppear并且presentViewController:animated:completion不会调用完成块.该应用程序只是坐在那里仍然显示frequencyViewController,直到我再次点击.现在,调用viewWillAppear,viewDidAppear和完成块.
我调查了一下,并不只是另一个水龙头会导致它继续下去.看起来如果我倾斜或摇动我的iPhone,这也可能导致它触发viewWillLoad等.就像它正在等待任何其他位用户输入才会进展.这发生在真正的iPhone和模拟器中,我通过向模拟器发送shake命令证明了这一点.
我真的不知道该怎么做......我真的很感激任何人都可以提供帮助.
谢谢
这是我的代码.这很简单......
这是questionViewController中的代码,它充当questionTableView的委托
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row != [self.frequencyModel currentFrequencyIndex])
{
// If guess was wrong, then mark the selection as incorrect
NSLog(@"Incorrect Guess: %@", [self.frequencyModel frequencyLabelAtIndex:(int)indexPath.row]);
UITableViewCell *cell = [self.frequencyTableView cellForRowAtIndexPath:indexPath];
[cell setBackgroundColor:[UIColor colorWithRed:240/255.0f green:110/255.0f blue:103/255.0f alpha:1.0f]];
}
else
{
// If guess was correct, show correct view
NSLog(@"Correct …Run Code Online (Sandbox Code Playgroud) 我有一个托管UINavigationController的UIPopoverController,它包含一个小的视图控制器层次结构.
我按照文档和每个视图控制器,我设置了视图的popover-context大小,如下所示:
[self setContentSizeForViewInPopover:CGSizeMake(320, 500)];
Run Code Online (Sandbox Code Playgroud)
(每个控制器的大小不同)
当我在层次结构中向前导航时,这可以正常工作 - 弹出窗口自动动画大小更改以对应于推送的控制器.
但是,当我通过导航栏的"后退"按钮通过视图堆栈"返回"时,弹出窗口不会改变大小 - 它仍然与最深的视图一样大.这似乎对我不利; 我希望popover能够尊重弹出视图堆栈时设置的大小.
我错过了什么吗?
谢谢.
uiviewcontroller uinavigationcontroller uipopovercontroller ios
我有一个视图控制器层次结构,最顶层的控制器显示为模态,并想知道如何在使用时显示导航栏
'UIViewController:presentViewController:viewControllerToPresent:animated:completion'
Run Code Online (Sandbox Code Playgroud)
'presentViewController的文档:动画:完成:'注意:
'在iPhone和iPod touch上,呈现的视图始终为全屏.在iPad上,演示文稿取决于modalPresentationStyle属性中的值.
对于'modalPresentationStyle',文档说:
演示样式确定如何在屏幕上显示模态呈现的视图控制器.在iPhone和iPod touch上,模态视图控制器始终以全屏显示,但在iPad上有几种不同的显示选项.
一旦视图控件显示自己,是否有办法确保导航栏在状态栏下方可见?我应该将文档解释为,你没有获得iPhone/iPod的任何选项,只能在iPad上?
以前,我使用的'UIViewController:presentModalViewController:animated'工作正常,但自iOS 5.0以来,API已被弃用,因此我转而使用新版本.
在视觉上,我要做的是从屏幕底部开始使用新控制器,就像过去使用的旧API一样.
[用代码更新]:
// My root level view:
UIViewController *vc = [[RootViewController alloc]
initWithNibName:nil
bundle:[NSBundle mainBundle]];
navController = [[UINavigationController alloc] initWithRootViewController:vc];
....
// Within the RootViewController, Second view controller is created and added
// to the hierarchy. It is this view controller that is responsible for
// displaying the DetailView:
SecondTierViewController *t2controller = [[SecondTierViewController alloc]
initWithNibName:nil
bundle:[NSBundle mainBundle]];
[self.navigationController pushViewController:t2controller animated:YES];
// Created by SecondTierViewController
DetailViewController *controller = …Run Code Online (Sandbox Code Playgroud) iphone uiviewcontroller modalviewcontroller presentmodalviewcontroller ios
在iOS中,在UIViewController的视图中有一个嵌套的视图控制器视图通常是不好的编程习惯吗?比方说,我希望有某种响应用户触摸的互动元素,但只占屏幕的25%.
我想我会把这个嵌套的视图控制器添加到我的UIViewController中,例如:
[self.view addSubview: nestedViewController.view];
Run Code Online (Sandbox Code Playgroud)