【问题标题】:iOS override a SegueiOS 覆盖 Segue
【发布时间】:2014-09-11 13:42:21
【问题描述】:

我有一个 tableview 控制器,我想覆盖最后一行的 segue。我不想去标准的目标视图控制器,而是想把它发送到另一个控制器。我该怎么做?

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSIndexPath *myIndexPath = [self.tableView
                            indexPathForSelectedRow];
    long row = [myIndexPath row];
    if ([[segue identifier] isEqualToString:@"ShowLocationsTableView"])
    {
        LocationsTableViewController *ViewController =
        [segue destinationViewController];

        ViewController.categoryDetailModel = @[_categoryTitle[row],
                                            _categoryImages[row]];
    }
}

这是当前的 prepareForSegue,我想更改它。我想使用segue“aboutCat”将它发送到另一个视图控制器。我该怎么做?

我不明白 prepareForSegue [current] 和 viewDidLoad [destination] 之间发生了什么。谢谢

副作用

“Nikita Take”解决了最初的问题,但有一些副作用

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSIndexPath *myIndexPath = [self.tableView indexPathForSelectedRow];
    long row = [myIndexPath row];
    if ([_categoryTitle[row] isEqualToString:@"About"])
    {
        NSLog(@"SKIPPING PREPARE");
    } 
    else if ([[segue identifier] isEqualToString:@"ShowLocationsTableView"])
    {
        LocationsTableViewController *ViewController =
        [segue destinationViewController];

        ViewController.categoryDetailModel = @[_categoryTitle[row],
                                            _categoryImages[row]];
    }
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (tableView == self.tableView) 
    {
        // I assume you have 1 section
        NSLog(@"DIDSELECTROW");
        NSLog(@"INDEX PATH %i", indexPath.row + 1);
        NSLog(@"%i", [tableView numberOfRowsInSection:0]);
        if (indexPath.row + 1 == [tableView numberOfRowsInSection:0]) 
        {
            NSLog(@"ABOUT");
            [self performSegueWithIdentifier:@"aboutCat" sender:self];
        } 
        else 
        {
            NSLog(@"ELSE");
            [self performSegueWithIdentifier:@"ShowLocationsTableView" sender:self];
        }
    }
}

现在关于工作!但是,如果我单击另一行,它是 mainSegue 之一。它将调用子视图控制器 2x。我可以在 detailview viewdidload 中使用 NSLOG 语句来验证这一点。问题是现在导航控制器需要两个步骤才能返回。

[home] -> [detail view] -> [same detail view]

我可以验证 didselectrowatindexpath 发生在 prepareforsegue 之前

知道为什么要执行两个 segue 吗?

【问题讨论】:

  • 然后在 didselctrowatIndexpath 中添加另一个 segue
  • 我可以添加那个方法吗?还需要采取其他措施吗?
  • 你需要一些不同的方法

标签: ios objective-c xcode segue


【解决方案1】:

假设你有两个 segues:MainSegue(除最后一行之外的所有行)和LastRowSegue(最后一行)你可以这样做:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (tableView == self.tableView) {
        // I assume you have 1 section
        if (indexPath.row == [tableView numberOfRowsInSection:0]) {
            [self performSegueWithIdentifier:@"LastRowSegue" sender:self];
        } else {
            [self performSegueWithIdentifier:@"MainSegue" sender:indexPath];
        }
    }
}

试试这个prepareForSegue。如果不是你需要的,请解释一下你的意思

它可以工作,但我得到的是双层表格视图

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"MainSegue"]) {
        NSIndexPath *selectedIndexPath = sender;
        LocationsTableViewController *locationController = segue.destinationViewController;
        locationController..=categoryDetailModel = @[_categoryTitle[selectedIndexPath.row], _categoryImages[selectedIndexPath.row]];
    }
}

【讨论】:

  • 它可以工作,但我得到了双层表格视图。我应该删除 prepareforsegue 方法吗?
  • 是的,你不应该改变prepareForSegue中的segue标识符或segue目的地
  • 我将把这段代码放在哪里(来自 prepareforsegue)?:这是用于 MainSegue,但我如何传递这些值 -> ' LocationsTableViewController *ViewController = [segue destinationViewController]; ViewController.categoryDe​​tailModel = @[_categoryTitle[row], _categoryImages[row]];'
  • 更新了带有副作用的问题。谢谢
【解决方案2】:

您不能在 prepareForSegue 中执行此操作 - 源视图控制器和目标视图控制器在调用 prepareForSegue 时已经定义。您需要从您的控制器(不是单元格)进行两个 segue,并在 didSelectRowAtIndexPath 中调用 performSegueWithIdentifier:sender"。根据 indexPath 选择要执行的 segue。

【讨论】:

    【解决方案3】:

    你可以这样做

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    
    int lastIndex=[tableArray count]-1;
            if (indexPath.row == lastIndex) {
    
         UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
                                    NSString* viewType = @"MenuVC";//u can have the identifier of the LocationViewCOntroller or where ever you wanna go from here
                                    UIViewController* viewController = [storyboard instantiateViewControllerWithIdentifier:viewType];
                                    self.navigationController.viewControllers = [NSArray arrayWithObjects:viewController, nil];
            } else {
    
                [self performSegueWithIdentifier:@"usualSegue" sender:self];
    
            }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-18
      • 1970-01-01
      • 2020-10-27
      • 2015-03-25
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      相关资源
      最近更新 更多