【问题标题】:Invoking push segue programmatically and prepareforsegue method以编程方式调用 push segue 和 prepareforsegue 方法
【发布时间】:2013-12-31 19:31:11
【问题描述】:

我正在以编程方式调用push segue,如下所示

    UIStoryboard *mainStoryBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UIViewController *vc = [mainStoryBoard instantiateViewControllerWithIdentifier:@"addToCartViewContollerForItem"];
    [self.navigationController pushViewController: vc animated:YES];

但我的问题是我想用这个 segue 向目标视图控制器发送一些信息。但是- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 方法根本没有被触发。

prepareforsegue方法就是这样

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
    NSLog(@"segue from deals screen");
    //addToCartViewContollerForItem
    if([[segue identifier] isEqualToString:@"addToCartSegue"]){
        NSIndexPath *selectedRow = [[self tableView] indexPathForSelectedRow];

        Item *currentItem = [[Item alloc]init];
        currentItem = [itemList objectAtIndex:[selectedRow row]];

        RESTAddToCartViewController *vc = [segue destinationViewController];
        [vc setCurrentItem:currentItem];
    }
}

我在这里缺少什么?

【问题讨论】:

  • 你希望segue发生在哪个动作上,比如取消按钮动作或uitableview单元格选择?
  • uitableview 单元格选择。我使用didSelectRowAtIndexPath
  • 您可以在您编写的代码中直接使用没有 didSelectRow 方法的 prepareForSegue 方法,也可以从您的 didSelectRow 方法中调用 perform segue,查看我的答案。
  • 我认为主要的困惑在于帖子的第一行。该导航控制器推送不执行推送转场。正如@suhit 建议的那样,self performSegueWithIdentitifer 就是这样做的方法。
  • @dahn 说得对,UINavigationController pushViewController 不执行 push segue,最好的方法是 performSegueWithIdentitifer 和 prepareForSegue: 方法。

标签: ios iphone objective-c uistoryboard segue


【解决方案1】:

调用performSegueWithIdentifier: 通过您的didSelectRowAtIndexPath 方法

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self performSegueWithIdentifier:@"addToCartSegue" sender:self];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
    NSLog(@"segue from deals screen");
    //addToCartViewContollerForItem
    if([[segue identifier] isEqualToString:@"addToCartSegue"]){
        NSIndexPath *selectedRow = [[self tableView] indexPathForSelectedRow];

        Item *currentItem = [[Item alloc]init];
        currentItem = [itemList objectAtIndex:[selectedRow row]];

        RESTAddToCartViewController *vc = [segue destinationViewController];
        [vc setCurrentItem:currentItem];
    }

}

在 Swift 2.3 中

//MARK: didSelectRowAtIndexPath

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    performSegueWithIdentifier("addToCartSegue", sender: self)
}


// MARK: - Navigation

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    // Get the new view controller using segue.destinationViewController.
    if segue.identifier == "addToCartSegue" {
        let selectedIndexPath = self.tableView.indexPathForSelectedRow
        let currentItem: Item = itemList[selectedIndexPath.row]
        if let viewcontroller = segue.destinationViewController as? RESTAddToCartViewController {
            viewcontroller.currentItem = currentItem
        }
    }
}

斯威夫特 3

//MARK: didSelectRowAtIndexPath

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    performSegue(withIdentifier: "addToCartSegue", sender: self)
}

// MARK: - Navigation

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "addToCartSegue" {
        if let selectedIndexPath = self.tableView.indexPathForSelectedRow {
            let currentItem: Item = itemList[selectedIndexPath.row]
            if let viewcontroller = segue.destination as? RESTAddToCartViewController {
                viewcontroller.currentItem = currentItem
            }
        }
    }
}

【讨论】:

【解决方案2】:

这是您要查找的信息:

 (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"showRecipeDetail"]) {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        RecipeDetailViewController *destViewController = segue.destinationViewController;
        destViewController.recipeName = [recipes objectAtIndex:indexPath.row];
    }
}

prepareForSegue 将与[self perform segue] 一起被调用 这是tutorial,你一定要看看。

【讨论】:

  • 如果他正确执行segue,这是一个很好的答案。但是在他执行SegueWithIdentifier之前,不会调用此代码:
  • 我实际上希望他查看其余的教程,因为这正是他想要做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2017-06-12
  • 2015-08-31
相关资源
最近更新 更多