【问题标题】: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 而不是用笔记内容填充它:/

这是我得到的错误:

谢谢!

【问题讨论】:

    标签: ios iphone objective-c uiviewcontroller


    【解决方案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 会触发。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-06
          • 2023-03-11
          • 2019-02-02
          • 1970-01-01
          相关资源
          最近更新 更多