Tag: uiviewcontroller

单functionclosures所有打开的视图控制器

我有一个应用程序是一个单一的视图应用程序。 我有一个导航控制器连接到从根视图控制器的所有子控制器。 在每个儿童控制器中,我有一个注销button。 我想知道是否我可以调用一个函数来closures所有沿途打开的控制器,无论用户按下注销时哪个控制器当前处于打开状态? 我的基本开始: func tryLogout(){ self.dismissViewControllerAnimated(true, completion: nil) let navigationController = UINavigationController(rootViewController: UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("LoginViewController") ) self.presentViewController(navigationController, animated: true, completion: nil) } 我正在寻找执行此任务的最有效的内存方式。 我会把我的注销function放在一个单独的utils文件中,但是我不能使用self。 而且我仍然有知道哪些控制器dynamic解雇的问题。 build议将Pop 更新到根视图控制器。 所以我的尝试是这样的: func tryLogout(ViewController : UIViewController){ print("do something") dispatch_async(dispatch_get_main_queue(), { ViewController.navigationController?.popToRootViewControllerAnimated(true) return }) } 这是实现我所追求的最好方式吗?

用完成块来呈现和解除UIViewController – 没有协议和委托

我想从VC1一个实例中展示一个VC2实例,并在VC2解散时传递一个完成块来执行。 传递的完成块将是VC1实例上的一个方法调用。 这样做的正确方法是什么? 从VC1提交VC2通常是: VC2 *vc2 = [[VC2 alloc] init]; [self presentViewController:vc2 animated:YES completion: nil]; 并在VC2中 [self dismissViewControllerAnimated:YES completion: nil]; (ps通常我会在VC2中像这样解除VC2 – 即调用在协议中声明的VC1方法 [self.delegate dismissVC2]; // basically meaning VC1 to dismiss VC2 …但我想VC2也可以自行解散 – 但是我不确定这是否总是好的。 在苹果文档中,他们仍然推荐授权scheme – 但是自我解雇也是如此。 你能评论一下吗?) 我想在VC2中这样做: [self dismissViewControllerAnimated:YES completion: passedBlockFromVC1]; 当提交VC2时,通过这个passedBlockFromVC1以某种方式传递给VC2 – 同时包含一个VC1方法。 这样做的正确方法是什么? 总之,我正在寻找一个解决scheme来展示来自VC1的VC2,当VC2被解散时,它在完成时调用一个VC1方法 – 所有这些都不需要定义一个协议或者使用一个委托(在这里我觉得很麻烦)案件 – 但非常可靠) 这是可能的,并build议? 非常感谢!

UINavigationController:在每次转换后显示embedded的视图控制器不同的方向?

这是StackOverflow常见的问题,但没有其他解决scheme的工作。 许多也是几年前写的。 这里是一些考虑的职位: UINavigationController中的viewControllers有可能有不同的方向吗? 在UINavigationController中只支持一个视图的横向 UINavigationController中的viewControllers有可能有不同的方向吗? 为什么使用UINavigationController时无法强制横向? 如何强制在iOS 8视图控制器方向? 我们在UINavigationController中embedded了几个视图控制器:A,B,C,D。 A,B使用肖像。 C,D使用景观。 A是根控制器。 假设B被推到A.这是因为B是肖像。 但是,当C被推到B上时,由于类文档状态,屏幕不会旋转: 通常,系统只在窗口的根视图控制器或呈现的视图控制器上调用此方法以填充整个屏幕; 子视图控制器使用父视图控制器为其提供的窗口部分,不再直接参与关于支持哪些旋转的决定。 因此,在自定义的UINavigationController中重写supportedInterfaceOrientations并不会有帮助,因为在embedded式控制器的转换中没有查询它。 实际上,我们需要一种方式来强制转型时的方向转变,但似乎没有支持的方法。 下面是我们如何覆盖UINavigationController(扩展仅用于debugging目的,因为明显的扩展不应该用于覆盖): extension UINavigationController { override open var shouldAutorotate: Bool { return true } override open var supportedInterfaceOrientations : UIInterfaceOrientationMask { return visibleViewController?.supportedInterfaceOrientations ?? UIInterfaceOrientationMask.landscapeRight } } 在embedded式视图控制器中,我们尝试设置像这样的方向: override var shouldAutorotate: Bool { return true } override […]

在没有Segues的Storyboard之间传递variables – Swift

我在Xcode中的两个不同的.storyboard文件中的两个不同的UIViewControllers之间传递数据。 (这是一个相当大的项目,所以我不得不把它分解成不同的故事板。) 我已经在视图中build立了“exercisePassed”variables(string),我想将数据传递给我,并且我已经知道如何在位于不同故事板中的两个视图之间移动。 像这样。 var storyboard = UIStoryboard(name: "IDEInterface", bundle: nil) var controller = storyboard.instantiateViewControllerWithIdentifier("IDENavController") as! UIViewController //************************************** var ex = //Stuck Here ex.exercisedPassed = "Ex1" //************************************** self.presentViewController(controller, animated: true, completion: nil) 如何在不使用Segue / PrepareForSegue的情况下传递数据?

在尚未显示的UIViewController上预加载UIWebView

我有一个应用程序在最后一个UIViewController有一个UIWebView …用户导航通过应用程序,并在最后,他们可以过渡(模态)与UIWebView的最终UIViewController …在它的viewDidLoad我有UIWebView加载页面。 问题是大约需要8秒钟来加载这个页面,并且会让用户感到恼火。 如何提前加载UIWebView的方式(如应用程序首次启动!)如果该UIViewController甚至还没有提交?

插件与UIViewController

有人可以向我解释一个cordovaiOS插件的生命周期吗? 特别是,我有一个插件,我正在试图开发包含一个UIView (和相关的UIViewController )。 如何从我的扩展CDVPlugin类获得Cordova UIView ,所以我可以添加我的插件作为子视图(它是如何工作的?)。 我想暂时在我的Cordova应用程序的顶部显示我的UIView ,然后解散它,返回到我的JS / HTML应用程序。

当使用UINavigationController时,我的控制器的viewWillAppear或viewDidAppear方法不会被调用

这是球场。 我有一个UIViewController子类,它在viewWillAppear和viewDidAppear方法中做了一些事情。 我想在UINavigationViewController中嵌套这个视图控制器。 根据视图层次的复杂性,我的控制器的两个方法viewWillAppear和viewDidAppear可能不会被调用。 我应该怎么做才能确保这两个方法总是被调用,而不pipe我的视图层次? “复杂”视图层次结构的示例: UIViewController subclass containing a UITabBarController |_ Each tab containing a UINavigationViewController |_ Each UINavigationController controller containing a custom UIViewController 当您将TabBarController作为模式视图呈现时,将调用TabBarController的viewWillAppear和viewDidAppear方法,但不嵌套在UINavigationViewControllers下嵌套的自定义UIViewController。

呈现一个透明的模态UIViewController

我试图自己做一个自定义alertView(对于iOS7 +),但我挣扎alertView演示。 我有一个UIViewController与黑色背景(alpha设置为0.25f),并将alertView作为子视图。 当我想显示alertView时,我以模态方式呈现viewController: -(void) show { UIWindow* window = [[UIApplication sharedApplication] keyWindow]; self.modalTransitionStyle = UIModalPresentationCustom; self.transitioningDelegate = self; [window.rootViewController presentViewController:self animated:YES completion:nil]; } 这是我的animation师对象: -(NSTimeInterval) transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext { NSLog(@"%s",__PRETTY_FUNCTION__); return 2; } -(void) animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext { NSLog(@"%s",__PRETTY_FUNCTION__); UIView* toView = [transitionContext viewForKey:UITransitionContextToViewKey]; toView.alpha = 0; UIView* container = [transitionContext containerView]; [container addSubview:toView]; [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{ […]

在显示新视图之前,iOS会冻结很多秒

在我的应用程序的主视图中,我有一个表视图和两个原型单元格。 我已经使用故事板为每个单元configuration了segues。 在视图控制器中,我将覆盖prepareForSegue将所选单元格上的信息传递到目标视图。 目标视图不是特别复杂,当然也不需要任何繁重的处理来加载。 问题 当我第一次点击主控制器上的一个单元时,目标视图会在5到40秒的长时间延迟后出现。 编辑#2 :后来的水龙头通常更快 注意: 如果在目标视图出现之前再次敲击同一个单元格,则会触发目标视图立即出现。 如上所述,但点击不同的单元格会导致视图立即显示,但会显示来自第一个单元格的数据。 如上所述,但是点击不同的控件(没有关联的段落)会触发目标视图立即出现。 随后的“点击”通常显示较less的延迟。 时间分析器 – 为了我所能看到的 – 显示在这么多秒的延迟期间绝对没有发生任何事情。 我尝试过不同types的赛车,但没有什么区别 一些println显示,发生以下一系列事件: 在主要观点中,prepareForSegue被执行(没有延迟) 那么目标viewDidLoad被执行(没有延迟) …很长时间… 目的地控制器中的集合和表视图开始调用数据源相关的方法来从控制器获取数据。 该视图终于出现(带有不需要的animation,顺便说一句,但这是一个不同的问题) 从我读过的这个话题中,我怀疑这个问题可能与后台线程中发生的一些上述操作有关。 任何想法我可能做错了什么? 编辑#1 :添加了一些代码 在主视图控制器中,使用故事板链接了链接(CTRL-将两个原型单元格拖到目标视图中)。 代码看起来有点像下面这样: override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { var assetIndex = assetsTable.indexPathForSelectedRow()?.row println("prepare for segue – start: \(assets[assetIds[assetIndex!]]!.Name)") if let destination = segue.destinationViewController as? AssetThingsListViewController […]

Deinit没有调用UIViewController,但是Dealloc是

看起来像dealloc的Swift相当于deinit 。 但是,当您尝试在UIViewController上定义方法时,它不会像您所期望的那样运行… build立 使用Xcode 7.0在Swift或Objective-C中创build一个新的Single View项目。 在用故事板创build的视图控制器上添加一个“解除”button(我将这个视图控制器称为VC2;它的类是ViewController)。 添加一个新的视图控制器,并将其设置为初始视图控制器(VC1,类为零)。 向VC1添加“呈现”button,将“呈现模式”延续到VC2。 在VC2的代码中,在deinit (Swift)或dealloc (Objective-C)中放置一个断点。 在VC2中,使“解除”button的操作执行以下操作: // Swift: presentingViewController?.dismissViewControllerAnimated(true, completion: nil) // Objective-C: [self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; 运行该应用程序,并点击两个button,首先提出VC2,然后解雇它。 注意在Objective-C中 , dealloc断点是如何被命中的 。 另一方面,在Swift中 , deinit断点永远不会被deinit 。 为什么deinit从不被调用? 这是一个错误还是devise? 如果这是devise,那么当不再需要视图控制器时,我应该在哪里放置清理代码以释放资源? (它不能在viewDidUnload因为这个方法已经被弃用了,它不能在viewDidDisappear因为别的东西可能持有对它的引用,并且最终会再次显示它。) 注意:如果你试图在Swift中定义一个dealloc方法,你会得到下面的错误: 使用Objective-Cselect器“dealloc”的方法“dealloc()”与具有相同Objective-Cselect器的deinitializer冲突。 如果你有从一个Objective-C控制器inheritance的Swift视图控制器,并且你在Objective-C dealloc方法中放置一个断点,你将得到与上面定义的相同的错误行为: deinit不会被调用,但dealloc将调用。 如果您尝试使用Allocations查看内存中类的实例数,则两个版本都显示相同的内容: # Persistent始终为1,并且每次显示第二个视图控制器时# Transient增加。 鉴于上述设置,应该没有强大的参考周期坚持视图控制器。