当 segue 即将执行到另一个视图控制器时,prepareForSegue 是不是会通知视图控制器?
Posted
技术标签:
【中文标题】当 segue 即将执行到另一个视图控制器时,prepareForSegue 是不是会通知视图控制器?【英文标题】:Is a prepareForSegue notify a view controller when a segue is about to preform to another view controller?当 segue 即将执行到另一个视图控制器时,prepareForSegue 是否会通知视图控制器? 【发布时间】:2014-04-04 13:33:56 【问题描述】:到目前为止,我已经使用prepareForSegue
方法通知视图控制器,他将要从不同的视图控制器审查 segue,但如果我是发送 segue 的 vc,我的 prepareForSegue (在他同样segue 发送者的类)会在他触发 segue 之前检查是否有要执行的代码?
我之所以问,是因为我在这里得到了一个解决方案来执行一个简单的 segue,只是从代表笔记的稳定视图行转到用于编辑的笔记的创建页面......非常简单,但由于某种原因它没有呈现我在创建页面中的注释,只带我到一个新的干净的创建页面..
所以我虽然可能是因为 prepareForSegue 方法..在这里你可以看到问题给你更多细节How to to create a segue to push back to editing mode from a table view?
非常感谢您在这方面的帮助。
这是我添加到我的 NotesList 表视图控制器的 2 个方法:
#pragma mark - delegate
- (void) tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
[self performSegueWithIdentifier:@"noteSegue" sender:nil];
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([[segue identifier] isEqualToString:@"noteSegue"])
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
NMNote *note = [self.notes objectAtIndex:indexPath.row];
NMCreateNotesViewController *destination = [segue destinationViewController];
destination.textField.text = note.content;
我确保情节提要中的 segue 标识符命名为 noteSegue。那么为什么它的笔记工作......我得到一个新的 TextView 而不是用笔记内容填充它:/
这是我得到的错误:
谢谢!
【问题讨论】:
【参考方案1】:prepareForSegue:
方法在 当前 VC 而非目标上调用。 UIViewController Class Reference。您可以使用该方法获取对目标 VC 的引用,并在执行 segue 之前对其设置变量/调用方法。
像这样调用segue:
[self performSegueWithIdentifier:@"NAMEOFSEGUE" sender:nil];
然后您可以像这样准备目标 VC:
#import "NMCreateNotesViewController.h"
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([[segue identifier] isEqualToString:@"NAMEOFSEGUE"])
NMCreateNotesViewController *destination = [segue destinationViewController];
[destination createNote]; /* or something similar */
编辑:
- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
NMNote *note = [self.notes objectAtIndex:indexPath.row];
[self performSegueWithIdentifier:@"noteSegue" sender:note];
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([[segue identifier] isEqualToString:@"NAMEOFSEGUE"])
NMCreateNotesViewController *destination = [segue destinationViewController];
NMnote *note = (NMNote*) sender;
destination.textField.text = note.content;
【讨论】:
嗨@Ashley,我最后在问题中添加了一些代码,由于某种原因它仍然对我不起作用......请帮助弄清楚它让我发疯了嘿。谢谢! 修改了我的答案。您还使用了没有 DEselect 而不是 didSelect。我总是犯同样的错误(我怪xCode的自动完成) 嘿,这个错误很烦人:/我确实实现了你的建议,我绝对理解它背后的逻辑,但现在又出现了一个 SIGABRT 错误,我添加了错误的截图..谢谢 :) @Ashley 【参考方案2】:要在 segue 之前检查是否有要执行的代码,您可以使用以下解决方案:
if ([segue.destinationViewController isKindOfClass:[UIViewController class]])
UIViewController *nextVC = segue.destinationViewController;
if(nextVC respondsToSelector:@selector(yourMethod))
[nextVC yourMethod];
【讨论】:
【参考方案3】:你可以通过实现这个方法来检查你是否确定执行特定的segue
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
【讨论】:
【参考方案4】:如果您在 viewDidLoad
中有您的笔记显示代码,请尝试将其移至 viewDidAppear
(在您的笔记编辑 VC 中)。从TableView
行呈现时曾经存在一个问题,在执行 VDL 后 segue 会触发。
【讨论】:
以上是关于当 segue 即将执行到另一个视图控制器时,prepareForSegue 是不是会通知视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章
使用 IBAction 将数据传递到另一个视图控制器而无需 segue swift