当segue要执行到另一个视图控制器时,prepareForSegue是否通知视图控制器?

时间:2014-04-04 13:33:57

标签: ios iphone objective-c uiviewcontroller

到目前为止,我已经使用prepareForSegue方法通知视图控制器他将要查看来自不同视图控制器的segue,但如果我是发送segue的vc,那么我的prepareForSegue(在同一类的segue发送者)会在他开火之前检查是否有预先形成的代码?

我问是因为我在这里得到了一个解决方案来预先形成一个简单的segue只是为了从表示注释的稳定视图行到编辑注释的创建页面...非常简单,但是由于某种原因它没有呈现我在创建页面中的注释,只会将我带到一个新的干净创建页面..

所以我想也许是因为prepareForSegue方法......你可以看到问题给你更多细节How to to create a segue to push back to editing mode from a table view?

非常感谢您的帮助。

这是我添加到NotesList表视图控制器的两种方法:

#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而不是用注释内容填充它:/

这是我得到的错误:

enter image description here

谢谢!

4 个答案:

答案 0 :(得分:2)

当前 VC而不是目标上调用prepareForSegue:方法。 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;
    }
}

答案 1 :(得分:0)

要检查在segue之前是否有要执行的代码,您可以使用以下解决方案:

if ([segue.destinationViewController isKindOfClass:[UIViewController class]]) {
        UIViewController *nextVC = segue.destinationViewController;
        if(nextVC respondsToSelector:@selector(yourMethod)){
              [nextVC yourMethod];
        }
}

答案 2 :(得分:0)

您可以通过实施此方法检查您是否确定要执行特定的segue

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender

答案 3 :(得分:0)

如果您的笔记在viewDidLoad中显示代码,请尝试将其移至viewDidAppear(在编辑VC的笔记中)。从TableView行提交VDL执行后将触发segue时会出现问题。