Objective c 预加载模态视图控制器
有没有一种方法可以在不显示模态视图控制器的情况下预加载它? 我这样问是因为当我显示模态视图控制器(分配和初始化视图控制器类)时,视图的加载和显示会有一点延迟。 之后,当我再次尝试显示它时,延迟停止Objective c 预加载模态视图控制器,objective-c,Objective C,有没有一种方法可以在不显示模态视图控制器的情况下预加载它? 我这样问是因为当我显示模态视图控制器(分配和初始化视图控制器类)时,视图的加载和显示会有一点延迟。 之后,当我再次尝试显示它时,延迟停止 我使用的是UITableView,在方法ScrollViewDiEndDraging中,我检查contentOffset.y是否小于-90。如果是这样,用户基本上是“拉动刷新”,那么我正在加载视图。您可以调用ViewWillDisplay,viewDidLoad手动加载。 您可以使用UINib将XIB
我使用的是
UITableView
,在方法ScrollViewDiEndDraging
中,我检查contentOffset.y
是否小于-90。如果是这样,用户基本上是“拉动刷新”,那么我正在加载视图。您可以调用ViewWillDisplay,viewDidLoad手动加载。- 您可以使用
将XIB预加载到内存中UINib
UINib
的instantiate
方法来实例化视图
- 您还可以通过调用
的UIViewController
getter方法强制加载view
(因为视图是延迟加载的,所以第一次访问它时将从XIB加载)view
使用Instruments及其“Time Profiler”工具检查XIB文件的加载过程到底需要多少时间。(可能这很容易解决,或者可能您会有一些组件,只有在视图显示后才可以延迟加载,等等)。您可以加载视图上的所有内容,然后显示它
或者,您可以加载modalview的所有属性,然后使用方法显示它。使视图成为属性。您可以尝试访问视图,这将使viewDidLoad方法被调用,尽管这不是应该做的事情
//Preload
YourViewController * controller = [[YourViewController alloc] init];
controller.view.backgroundColor = [UIColor whiteColor];
.
.
.
.
//Load Controller after time
[self presentModalViewController:controller animated:YES];
PS:我知道有很多这样的问题,但没有人给出真正的解决方案。调用
view会出现,而viewDidLoad
不会从XIB加载任何内容。调用视图
getter方法将失败,因为UIViewController
的视图是延迟加载的(仅在第一次需要时从XIB加载),因此显式查询它将从XIB加载。但无论如何,您只能在主线程上执行此操作(因为所有UI加载都必须在主线程中完成),因此这仍然会在某个点冻结UI(仅在更早的时候,当您调用视图getter方法并强制加载视图时,而不是当您要求显示UIViewController
时)请注意,这仍然会阻止主线程,并在加载视图时冻结应用程序。唯一的区别是,它将在您访问视图
属性时冻结,而不是在您调用presentModalViewController:animated:
方法时冻结。然后您不需要预加载它,您需要使代码更快我昨天开始编码,我自己的代码不超过30行。请注意,在ScrollViewDiEndDraging
中预加载控制器没有任何意义,为了看到任何改进,您可以将其放在mainController ViewDiLoad或AppDelegate中,但正如AliSoftware所说,它会阻止UI,因此,当用户没有注意到你的应用程序时,你必须分析它的位置。我已经试过了,看起来延迟没有停止。看一下编辑。当我试图在用户停止拖动时加载一个视图时,0.2秒的延迟是非常糟糕的。实际上并没有真正解决。我认为这是一个正确的答案,因为你的提示是访问时间分析器,这确实帮助我认识到,无论什么情况下,视图仍然会冻结(甚至毫秒)。是的,但正如所解释的,无论你尝试什么,从XIB加载UI元素必须/始终只能在主线程上完成,而不能在单独的线程/队列上完成,就像对UI元素的任何操作一样。因此,在加载UI元素时,如果不冻结主线程,就无法加载XIB,因此这是无法解决的。唯一的伪解决方案是,如果您设法解决了加载缓慢的原因(例如,如果您自己的awakeFromNib
覆盖的某个实现花费了太多时间,或者您可以调整的任何其他代码),则解决加载缓慢的原因