所以我有一个屏幕可以检查某些属性,并且在定义的情况下会立即在 viewDidLoad 中以模态方式加载另一个 View ,没有动画,覆盖当前正在加载的 View (以免以显示下面的 View )。在 iOS 8 之前,完成此操作后,原始 View 将暂停其加载(不会继续 viewWillAppear、viewDidLayoutSubviews 等),直到覆盖 Controller 被关闭。我发现这种行为适合我的需要,因为原始 View 中元素的任何动画都可以完成。然而,在 iOS 8 中,我得到了一个完全不同的事件链。首先,出于某种原因 viewDidLayoutSubviews 被调用了两次(这是怎么回事?)但更重要的是, View 不喜欢在 viewDidAppear 之前的任何时候弹出另一个 Controller ,提示 开始/结束外观转换的调用不平衡。不仅如此,底层的 viewController 会继续加载(viewWillAppear、viewDidLayoutSubviews 等),即使它没有显示,这会导致所有在这些事件中触发的方法。如果 Apple 更新了实现此类目标的方式,我将不胜感激,因此,如果新元是一个完全不同的过程,我愿意采用,但是,我无法让它正常工作。
对于如何让这个模态视图插入而不导致底层 View 继续加载的任何帮助,我将不胜感激。
谢谢,
迈克
更新: 将引入一些代码。下面是主要 viewController 的 viewDidLoad,如果需要,它会呈现模态 VC。
-(void) viewDidLoad{
if(hasNotSeenTutorial){
TutVC* vc = [[TutVC alloc] initWithNibName:@"tutNib" bundle:nil]
vc.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self.navigationController presentViewController:vc animated:NO completion:^{
NSLog(@"Has Completed Presentation");
}];
}
}
这就是问题所在。在 viewDidLoad 中调用此处的呈现,导致呈现 VC 的呈现继续。在 iOS 8 之前,呈现的 VC 如果还没有呈现,会暂停,直到模态 VC 被关闭,然后它会像往常一样完成。根据我的原始帖子,在 iOS 8 中情况并非如此。
最佳答案
Apple 在 ios 8 中制定了更严格的规则。举个例子,我将通过这个来阐明我的观点:- 在我的应用程序中,我曾经从导航堆栈中弹出一些 View Controller ,然后,将 a新的,但在 ios7 中从未见过该 pop,似乎只发生了推送转换(从逻辑上讲,应该先看到 pop 然后再推送)。而在 ios 8 中,这件事发生了变化。现在只有在看到并注意到 pop 之后才会看到 push。这严重破坏了用户体验。
我也注意到其他领域的这种严格性,但那些与 UI/UX 无关,所以我现在不会详细介绍。
就您的情况而言,根据我的经验,我可以告诉您,您一直在以错误的方式做事。由于苹果已经严格执行,您的实现似乎中断了。 在我看来,唯一的解决方案是移动 viewdidAppear 中的每个检查。
如果您希望继续之前为 ios7 所做的方式,您可以使用此检查:
if([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
{
// Code for ios 8 implementation
}
else
{
// Code for ios 7 implementation
}
虽然我会建议您避免,因为您的目标是完全可以实现的。 此外,您正在做的事情很容易导致导航堆栈不一致,从而导致应用程序崩溃。
关于iOS 8 viewDidLoad 模态呈现导致多次呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25948707/
我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby数组,我们在StackOverflow上找到一
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
我是HanamiWorld的新人。我已经写了这段代码:moduleWeb::Views::HomeclassIndexincludeWeb::ViewincludeHanami::Helpers::HtmlHelperdeftitlehtml.headerdoh1'Testsearchengine',id:'title'hrdiv(id:'test')dolink_to('Home',"/",class:'mnu_orizontal')link_to('About',"/",class:'mnu_orizontal')endendendendend我在模板上调用了title方法。htm
我目前正在用Ruby编写一个项目,它使用ActiveRecordgem进行数据库交互,我正在尝试使用ActiveRecord::Base.logger记录所有数据库事件具有以下代码的属性ActiveRecord::Base.logger=Logger.new(File.open('logs/database.log','a'))这适用于迁移等(出于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时脚本失败并出现以下错误/System/Library/Frameworks/Ruby.frame
print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上
我正在尝试获得良好的Ruby编码风格。为防止意外调用具有相同名称的局部变量,我总是在适当的地方使用self.。但是现在我偶然发现了这个:classMyClass上面的代码导致错误privatemethodsanitize_namecalled但是当删除self.并仅使用sanitize_name时,它会起作用。这是为什么? 最佳答案 发生这种情况是因为无法使用显式接收器调用私有(private)方法,并且说self.sanitize_name是显式指定应该接收sanitize_name的对象(self),而不是依赖于隐式接收器(也是
下面的代码工作正常:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson)do|key,oldv,newv|ifkey==:aoldvelsifkey==:bnewvelsekeyendendputskerson.inspect但是如果我在“ifblock”中添加return,我会得到一个错误:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:HowdoIgeneratealistofnuniquerandomnumbersinRuby?我想做的事:Random.rand(0..10).timesdoputsRandom.rand(0..10)end但如果随机数已经显示过,则无法再次显示。如何最轻松地做到这一点?