当 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

从按钮执行 segue 时应用程序冻结

Swift UITableViewCell Segue 到另一个视图

如何过渡,例如淡入淡出,从一个视图控制器到另一个

Segue 图像到另一个视图控制器的问题