放松segue / performSegueWithIdentifier:问题
在我的应用程序中,有一个聊天服务。 当用户想要发送新消息时,他按下“新聊天”,并且显示一个表视图控制器以从朋友列表中select。 我正在使用unwind segues以返回到前一个视图控制器并在两个视图控制器之间共享数据(主要是数据将是与之聊天的朋友)。 但是在我的应用程序中,当用户返回到主VC时,为了直接到另一个用户进行聊天的VC,我激活一个新的继续; 这不起作用。 所有的赛段都很好连接,我试过每一个angular落的NsLog,它正在进入那里,甚至prepareForSegue:正在被访问。 我试图把一个NsTimer,认为可能会有一些技术冲突,并没有奏效。 我改变了聊天VC的模式到一个模式,现在它给了我这个错误:
警告:尝试呈现其视图不在窗口层次结构中的视图!
我可以用其他方式访问这个VC,它在层次结构中。 我的问题是:什么可能是错的? 放松segues改变窗口层次结构?
图片:
为了更直观的呈现这个问题,我所说的主要VC就是在左下方连接到一个导航视图控制器。 当用户按下新的聊天时,会显示右上angular的两个VC(一个在朋友或组之间进行select,另一个在朋友/组之间进行select)。 所以当从右上angularselect一个朋友的时候,我应该放弃继续到主VC。 正如你从主要的VC看到的那样,还有其他的赛段。 如果我放松继续,他们可以工作,如果我正常工作,他们会工作。
它不工作的原因,并给你这个错误是因为事情并没有按照你认为的顺序发生。
当展开的时候,可见的视图还没有被解散,因此你正在试图在一个视图上执行一个segue,事实上这个视图并不是像这个错误所说的那样在层次结构中,例如,把NSLog语句放在最后的视图中然后在主视图控制器的展开方法中,您可以看到以下内容:
2013-11-27 14:51:10.848 testUnwindProj[2216:70b] Unwind 2013-11-27 14:51:10.849 testUnwindProj[2216:70b] Will Appear 2013-11-27 14:51:11.361 testUnwindProj[2216:70b] View Did Disappear
因此,主视图中的展开被调用,视图将出现(您的主视图控制器),然后您的可见视图被解散。 这可能是一个简单的修复:
@interface ViewController () { BOOL _unwindExecuted; } @end @implementation ViewController - (void)viewWillAppear:(BOOL)animated { NSLog(@"Will Appear"); if (_unwindExecuted) { _unwindExecuted = NO; [self performSegueWithIdentifier:@"afterunwind" sender:self]; } } - (IBAction)unwind:(UIStoryboardSegue *)segue { NSLog(@"Unwind"); _unwindExecuted = YES; }
不要使用计时器或延迟来尝试预测何时可能存在视图。
相反,使用如下调用: – (void)dismissViewControllerAnimated:(BOOL)flag completion:(void(^)(void))completion
完成区块会让你知道你什么时候回到主要的风险投资。 或者,查看与segues相关的各种调用,以便您确切知道何时可以在新窗口上执行操作。
如果一切都失败了,总是有UIViewController的viewDidAppear。
这是处理展开的视图控制器的常见问题,因为在展开期间,视图控制器可能不在窗口层次结构中。
为了解决,我添加了一个属性segueIdentifierToUnwindTo
来协调展开。
这与JAManfredi的解答类似,但扩展到能够延续到任何视图控制器。
@interface FirstViewController () // Use this to coordinate unwind @property (nonatomic, strong) NSString *segueIdentifierToUnwindTo; @end @implementation FirstViewController - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; // Handle unwind if (_segueIdentifierToUnwindTo) { [self performSegueWithIdentifier:_segueIdentifierToUnwindTo sender:self]; self.segueIdentifierToUnwindTo = nil; // reset return; } // Any other code.. } // Example of an unwind segue "gotoLogin" - (IBAction)gotoLogin:(UIStoryboardSegue*)sender { // Don't perform segue directly here, because in unwind, this view is not in window hierarchy yet! // [self performSegueWithIdentifier:@"Login" sender:self]; self.segueIdentifierToUnwindTo = @"Login"; } @end
我还分享了如何在我的博客上使用FirstViewController展开细节: http : FirstViewController
好了解决了这个问题是,视图还没有,我不得不推迟这个过程:
[self performSelector:@selector(fireNewConv) withObject:nil afterDelay:1];
然而,有趣的是,我试图通过NSTimer延迟,但没有奏效。