Tag: uiviewcontroller

关于viewController的“viewDidLoad”和“viewWillAppear”方法

我有两个提到的方法有一个问题,因为在我的testing中,我不清楚它们被调用的顺序。 我认为,首先, viewDidLoad是在第一次加载viewController(如名称所示)时调用的,并在init方法之后立即调用。 然后,我想,一旦viewDidLoad返回, viewWillAppear被调用。 如果你显示另一个viewController,然后你返回到这个,那么它应该已经加载,只有viewWillAppear将被调用。 然而,在开发过程中,我给人的印象是调用viewDidLoad和viewWillAppear时没有顺序…我不能在Apple的文档中find这个生命周期的清晰描述,这实际上是如何工作的? 谢谢!

iOS – 具有故事板的UISplitViewController – 多个主视图和多个详细视图

我正在尝试使用UISplitViewController和storyboard来组合一个iPad应用程序。 主视图从导航控制器链接到6个菜单选项的表格视图开始。 表格中的每个单元格将不同的表格视图控制器推入导航堆栈。 这对主视图工作正常。 每个主视图都有一个表格列表,单击时需要在详细信息窗格中显示不同的视图控制器。 我目前已经做了一个segue设置为'replace'和'细节拆分',这是第一次点击一行,但一旦你点击主视图中的另一行,或旋转设备,然后应用程序崩溃与EXC_BAD_ACCESS。 我相当确定我的问题是如何为UISplitViewController设置代理。 我很困惑,当我有多个主VC和多个VC细节时,应该如何使用它。 代表代码应放在哪里 – 主人还是细节? 我必须在每个视图控制器中实现UISplitViewControllerDelegate协议事件吗? 任何帮助赞赏。

用animation交换rootViewController

我有点麻烦交换与animation的rootViewControllers。 以下是我正在使用的代码: [UIView transitionWithView:self.window duration:0.8 options:UIViewAnimationOptionTransitionFlipFromRight animations:^{ self.window.rootViewController = self.navigationController; } completion:nil]; 除了在animation之前的一些作品之外,屏幕变成黑色,然后animation出现。 它看起来像原始的rootViewController正在animation之前被删除。 有任何想法吗?

iOS:目前的视图控制器programmatically

我使用presentViewController:animated:completion:方法转到另一个视图控制器。 这是我的代码: AddTaskViewController *add = [[AddTaskViewController alloc] init]; [self presentViewController:add animated:YES completion:nil]; 这段代码进入另一个UIViewController但另一个控制器是空的。 我一直在使用故事板,但现在我需要在代码中完成。

topLayoutGuide在子视图控制器中

我有一个UIPageViewController与半透明的状态栏和导航栏。 它的topLayoutGuide是64像素,正如所料。 但是, UIPageViewController的子视图控制器报告0像素的topLayoutGuide ,即使它们显示在状态栏和导航栏下方。 这是预期的行为? 如果是这样的话,真正的topLayoutGuide下定位子视图控制器视图的最好方法是什么? (使用parentViewController.topLayoutGuide ,我认为这是一个黑客)

在更改transitionWithView内的rootViewController时泄漏视图

在调查内存泄漏时,我发现了一个与调用setRootViewController:的技术有关的问题setRootViewController:在一个过渡animation块中: [UIView transitionWithView:self.window duration:0.5 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{ self.window.rootViewController = newController; } completion:nil]; 如果旧视图控制器(被replace的视图控制器)当前正在呈现另一个视图控制器,则上述代码不会从视图层次结构中移除所呈现的视图。 就是这一系列的操作 X成为根视图控制器 X表示Y,所以Y的观点在屏幕上 使用transitionWithView:使Z成为新的根视图控制器 …对用户来说看起来没问题,但是Debug View Hierarchy工具将会在UITransitionView显示Y的视图仍然存在于Z的视图UITransitionView 。 也就是说,在上述三个步骤之后,视图层次是: 的UIWindow UITransitionView UIView(Y的观点) UIView(Z的观点) 我怀疑这是一个问题,因为在转换时,X的视图实际上并不是视图层次结构的一部分。 如果在transitionWithView:之前立即将dismissViewControllerAnimated:NO发送到X,则生成的视图层次结构为: 的UIWindow UIView(X的视图) UIView(Z的观点) 如果我将dismissViewControllerAnimated: (YES或NO)发送给X,则在completion:块中执行转换,然后视图层次结构正确。 不幸的是,这干扰了animation。 如果animation解雇,浪费时间; 如果没有animation,它看起来破碎。 我正在尝试一些其他的方法(例如,使一个新的容器视图控制器类作为我的根视图控制器),但没有发现任何工作。 我会随时更新这个问题。 最终目标是直接从呈现的视图转换到新的根视图控制器,而不会留下任何杂乱的视图层次结构。

请清除一些关于UIViewController的混淆

请清除一些关于UIViewController混淆 我发现这篇文章Abusing UIViewController ,这里是链接link1 & link2 并总结了几点 这是作者(和苹果)的build议简而言之: 一个(也是唯一的)视图控制器应该负责UIViews的整个层次(或屏幕)。 大多数情况下,你只能在每个屏幕上使用一个视图控制器。 本质上,当前UIWindow的rootViewController应该是唯一具有可见视图的UIViewController 。 每个不同的屏幕应该有一个不同的视图控制器,即一个控制器不应该控制多个屏幕。 您不应该在视图层次结构中嵌套自定义的UIViewControllers 。 如果多个UIViewController挂起应用程序的UIWindow ,则只有其中一个将获取方向更改的消息。 其他(S)不会得到这些消息。 嵌套的UIViewControllers无法保证(或者可能)接收到方向或生命周期消息(如viewDidAppear: , viewWillAppear: , viewDidDisappear:和viewWillDisappear:更改消息viewWillDisappear:即使它们从UIViewControllerinheritance。 只有最上面的UIViewController肯定会得到这些消息。 请清除2号和3号点,因为当我们使用UINavigationController或UITabBarController我们使用UIViewController多个子类。 而iOS设备只有一个屏幕….. 本文滥用UIViewController突出显示苹果的build议 注意:如果要将视图层次划分为多个子区域,并分别pipe理每个子区域,请使用通用控制器对象(从NSObject降序的自定义对象)而不是视图控制器对象来pipe理每个子区域。 然后使用单个视图控制器对象来pipe理通用控制器对象。 并在苹果文档下的Coordinating Efforts Between View Controllers的Coordinating Efforts Between View Controllers苹果说 很less有iOS应用程序只显示一个屏幕内容。 相反,它们会在首次启动时显示一些内容,然后显示和隐藏其他内容以响应用户操作。 这些转换提供了一个单一的统一的用户界面,显示大量的内容,只是不是一次….. 我的要求是不使用任何容器或模式或popover,我想做手动pipe理,我有两个视图控制器VC1和VC2 。 VC1是现在我想要切换/传输/移动到VC2的根视图控制器,我应该怎么做? VC1应该是UIViewController的唯一子类,而VC2应该是NSObject的子类来pipe理VC1层次结构中的特定视图?(由apple doc显示隐藏的东西)。 VC2也可以是UIViewController的子类,我只是从根视图中删除VC1 ,并添加VC2作为根视图? 或者什么是正确的方法?

延迟使用instantiateViewControllerWithIdentifier但不执行SegueWithIdentifier?

下面的代码用于将另一个视图控制器推到导航堆栈上。 当使用instantiateViewControllerWithIdentifier ,segue在第一次(〜3秒)明显缓慢,但是在随后的每一次都会相当快地发生。 其他SOpostbuild议确保代码完成的主线程上发生,但这并没有解决问题。 但是,使用performSegueWithIdentifier不会造成延迟。 SendViewController的viewDidLoad代码对于第一次和后续的推送是相同的。 尝试删除viewDidLoad目标视图控制器,但仍存在instantiateViewControllerWithIdentifier滞后,但不执行performSegueWithIdentifier 。 如何解决与instantiateViewControllerWithIdentifier延迟? 没有延迟: @IBAction func buttonTapped(sender: UIButton) { performSegueWithIdentifier(SendSegue, sender: self) } 第一次显示SendViewController时导致延迟: @IBAction func buttonTapped(sender: UIButton) { dispatch_async(dispatch_get_main_queue()) { let vc = self.storyboard!.instantiateViewControllerWithIdentifier(self.SendViewControllerID) as! SendViewController self.navigationController!.pushViewController(vc, animated: true) } }

在其View中从UIViewController触发一个方法

我有一个UIViewController与其包含UIButton UIView 。 我想触发button单击事件UIViewController的方法。 保持UIViewController引用似乎不是一个好主意,像下面的链接说: 从UIView获取UIViewController? 所以我想用一个委托来实现这个。 任何暗示如何实现这一点?

将Table更改为Edit模式并删除普通ViewController中的行

我只是将一个表插入一个普通的UIViewController中,并将委托和源组件连接到文件的所有者。 一切正常,当我插入数据到表行。 但现在我正在试图找出如何删除行。 我只是看了很多其他的post,但找不到合适的解决scheme。 我试图为表中的每一行插入一个断言button: cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton; 我甚至发现按下附件button时会调用的方法: – (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{ NSLog(@"Accessory pressed"); //[self tableView:tableView willBeginEditingRowAtIndexPath:indexPath]; //[self tableView:nil canEditRowAtIndexPath:indexPath]; //[self setEditing:YES animated:YES]; } 在日志内部打印消息,但没有任何一个我试图调用的方法(注释之一)确实将视图更改为编辑模式。 我怎么解决这个问题? 这里是UIViewController的屏幕截图。 我还没有集成一个navigationController。