获取"嵌套推送动画可能导致导航栏损坏"

时间:2014-07-08 20:05:53

标签: ios iphone objective-c xcode

我完全陷入困境。我一直在寻找答案,似乎每个人都有一个不同的问题,每个“嵌套推送动画可能会导致导航栏损坏”错误。

请记住,我正在尝试自学如何为iOS 7编写代码。因此,如果我的某些编码方法不理想,我很抱歉,请提供反馈。无论如何,我正在创建一个口袋妖怪交易卡游戏Pokedex应用程序,显示最新集的卡。除了在主屏幕上选择第一个表格单元格(XY Flash Fire)时,一切都完美无缺。它将显示正确的表格数据,但导航栏标题不正确。当我选择一行时,它也不会去PokedexDetailViewController。

同样,主屏幕中的所有其他表格单元格都没有问题。我还尝试了其他人在这里发布的修补程序和类以及github,但没有一个对我有效。我还重新创建了整个FlashFireViewController并仍然遇到了同样的问题。确保所有代码与其他工作视图控制器完全相同。还验证了segue来自Set View Controller,与细胞相对。但是,一旦它在Flash Fire View Controller中,segue就来自单元格。

暂不发布照片了,所以这是我的屏幕截图的专辑链接:http://imgur.com/a/Dq9py

  1. 我的故事板是如何设置的。
  2. 应用程序启动后的主屏幕。
  3. 当我选择第二个单元格(XY)时。
  4. 当我选择Mega Venusaur EX。
  5. **错误。当我选择第一个单元格(XY Flash Fire)时。它显示正确的表格数据,但没有显示正确的导航标题。
  6. 当我选择Butterfree或任何其他宠物小精灵时,没有任何反应,导航标题消失。此外,一旦我回击,应用程序崩溃并停止。
  7. 以下是TCGSetViewController.m的代码,它是主屏幕的类。

    @interface TCGSetViewController ()
    
    @end
    
    @implementation TCGSetViewController{
    
    
    
     NSArray *thumbnailCell;
    }
    
    @synthesize tableView = _tableView;
    
    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
            // Custom initialization
        }
        return self;
    }
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
    
        thumbnailCell = [NSArray arrayWithObjects:@"XYFlashFire.png", @"XYBaseSet.png", @"BWLegendaryTreasures", @"BWPlasmaBlast.png", @"BWPlasmaFreeze.png", @"BWPlasmaStorm.png", nil];
    
    }
    
    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
    
        return [thumbnailCell count];
    
    
    }
    
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return 61;
    }
    
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *simpleTableIdentifier = @"PokemonSetCell";
    
        TCGSetCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
    
        if (cell == nil) {
            cell = [[TCGSetCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
        }
    
        cell.setImage.image = [UIImage imageNamed:[thumbnailCell objectAtIndex:indexPath.row]];
    
        return cell;
    }
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        // Conditionally perform segues, here is an example:
        if (indexPath.row == 0)
        {
            [self performSegueWithIdentifier:@"showFlashFireSet" sender:self];
        }
        if (indexPath.row == 1)
        {
            [self performSegueWithIdentifier:@"showXYBaseSet" sender:self];
        }
        else
        {
            [self performSegueWithIdentifier:@"showLegendarySet" sender:self];
        }
    }
    

    这是FlashFireViewController.m的代码,它是第一个表格单元格。

    @interface FlashFireViewController ()
    
    @end
    
    @implementation FlashFireViewController{
    
        NSArray *pokemons;
        NSArray *searchResults;
    }
    
    @synthesize tableView = _tableView;
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
    
        Pokemon *caterpie = [Pokemon new];
        caterpie.name = @"Caterpie";
        caterpie.hitPoints = @"40 HP";
        caterpie.setNumber = @"1/106";
        caterpie.imageFile = @"1-caterpie.jpg";
        caterpie.rarity = @"COMMON";
    
        Pokemon *metapod = [Pokemon new];
        metapod.name = @"Metapod";
        metapod.hitPoints = @"70 HP";
        metapod.setNumber = @"2/106";
        metapod.imageFile = @"2-metapod.jpg";
        metapod.rarity = @"UNCOMMON";
    
        Pokemon *butterfree = [Pokemon new];
        butterfree.name = @"Butterfree";
        butterfree.hitPoints = @"130 HP";
        butterfree.setNumber = @"3/106";
        butterfree.imageFile = @"3-butterfree.jpg";
        butterfree.rarity = @"RARE";
    
        Pokemon *pineco = [Pokemon new];
        pineco.name = @"Pineco";
        pineco.hitPoints = @"60 HP";
        pineco.setNumber = @"4/106";
        pineco.imageFile = @"4-pineco.jpg";
        pineco.rarity = @"COMMON";
    
        Pokemon *seedot = [Pokemon new];
        seedot.name = @"Seedot";
        seedot.hitPoints = @"50 HP";
        seedot.setNumber = @"5/106";
        seedot.imageFile = @"5-seedot.jpg";
        seedot.rarity = @"COMMON";
    
        Pokemon *nuzleaf = [Pokemon new];
        nuzleaf.name = @"Nuzleaf";
        nuzleaf.hitPoints = @"80 HP";
        nuzleaf.setNumber = @"6/106";
        nuzleaf.imageFile = @"6-nuzleaf.jpg";
        nuzleaf.rarity = @"UNCOMMON";
    
        Pokemon *shiftry = [Pokemon new];
        shiftry.name = @"Shiftry";
        shiftry.hitPoints = @"140 HP";
        shiftry.setNumber = @"7/106";
        shiftry.imageFile = @"7-shiftry.jpg";
        shiftry.rarity = @"RARE";
    
        Pokemon *roselia = [Pokemon new];
        roselia.name = @"Roselia";
        roselia.hitPoints = @"60 HP";
        roselia.setNumber = @"8/106";
        roselia.imageFile = @"8-roselia.jpg";
        roselia.rarity = @"COMMON";
    
        Pokemon *roserade = [Pokemon new];
        roserade.name = @"Roserade";
        roserade.hitPoints = @"90 HP";
        roserade.setNumber = @"9/106";
        roserade.imageFile = @"9-roserade.jpg";
        roserade.rarity = @"UNCOMMON";
    
        Pokemon *maractus = [Pokemon new];
        maractus.name = @"Maractus";
        maractus.hitPoints = @"90 HP";
        maractus.setNumber = @"10/106";
        maractus.imageFile = @"10-maractus.jpg";
        maractus.rarity = @"UNCOMMON";
    
        pokemons = [NSArray arrayWithObjects:caterpie, metapod, butterfree, pineco, seedot, nuzleaf, shiftry, roselia, roserade, maractus, nil];
    
    }
    
    - (void)viewDidUnload
    {
        [super viewDidUnload];
        // Release any retained subviews of the main view.
    }
    
    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        if (tableView == self.searchDisplayController.searchResultsTableView) {
            return [searchResults count];
    
        } else {
            return [pokemons count];
        }
    }
    
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    
        static NSString *pokemonTableIdentifier = @"PokemonTableCell";
    
        TCGPokedexCell *cell = (TCGPokedexCell *)[self.tableView dequeueReusableCellWithIdentifier:pokemonTableIdentifier];
    
        if (cell == nil)
        {
            cell = [[TCGPokedexCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:pokemonTableIdentifier];
        }
    
    
        Pokemon *pokemon = [pokemons objectAtIndex:indexPath.row];
        if (tableView == self.searchDisplayController.searchResultsTableView) {
            pokemon = [searchResults objectAtIndex:indexPath.row];
        } else {
            pokemon = [pokemons objectAtIndex:indexPath.row];
        }
        cell.pokemonLabel.text = pokemon.name;
        cell.pokemonNum.text = pokemon.setNumber;
        cell.thumbnailImageView.image = [UIImage imageNamed:pokemon.imageFile];
        cell.pokemonHP.text = pokemon.hitPoints;
        cell.pokemonRarity.text = pokemon.rarity;
    
        return cell;
    
    }
    
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return 61;
    }
    
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    
        if ([segue.identifier isEqualToString:@"showPokedexDetail"]) {
            NSIndexPath *indexPath = nil;
            Pokemon *pokemon = nil;
    
            if (self.searchDisplayController.active) {
                indexPath = [self.searchDisplayController.searchResultsTableView indexPathForSelectedRow];
                pokemon = [searchResults objectAtIndex:indexPath.row];
            } else {
                indexPath = [self.tableView indexPathForSelectedRow];
                pokemon = [pokemons objectAtIndex:indexPath.row];
            }
    
            PokedexDetailViewController *destViewController = segue.destinationViewController;
            destViewController.pokemon = pokemon;
        }
    }
    
    - (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
    {
        NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText];
        searchResults = [pokemons filteredArrayUsingPredicate:resultPredicate];
    }
    
    -(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
    {
        [self filterContentForSearchText:searchString
                                   scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
                                          objectAtIndex:[self.searchDisplayController.searchBar
                                                         selectedScopeButtonIndex]]];
    
        return YES;
    }
    
    
    
    @end
    

    以下是我得到的确切错误代码:

    2014-07-08 12:38:18.409 TCG Pokedex[37666:60b] nested push animation can result in corrupted navigation bar
    2014-07-08 12:38:18.849 TCG Pokedex[37666:60b] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.
    2014-07-08 12:38:22.222 TCG Pokedex[37666:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can't add self as subview'
    *** First throw call stack:
    

2 个答案:

答案 0 :(得分:5)

您的问题最有可能发生在tableView:didSelectRowAtIndexPath的{​​{1}}。

您有TCGSetViewController.m语句后跟if语句。当if else第一个indexPath.row == 0为真时,执行if。但随后代码执行继续进入[self performSegueWithIdentifier:@"showFlashFireSet" sender:self]块。那里有两个独立的执行块。由于if else仍为0,我们将输入indexPath.row块,然后执行另一个segue。

您最有可能希望将其结构化为

else

更好的是,把它放在一个开关声明中:

if (indexPath.row == 0)
{
    [self performSegueWithIdentifier:@"showFlashFireSet" sender:self];
}
else if (indexPath.row == 1) // notice the else on this line
{
    [self performSegueWithIdentifier:@"showXYBaseSet" sender:self];
}
else
{
    [self performSegueWithIdentifier:@"showLegendarySet" sender:self];
}

P.S。:更多评论

从iOS 5或6或7或其他东西,NSString *segueID = nil; switch (indexPath.row) { case 0: segueID = @"showFlashFireSet"; break; case 1: segueID = @"showXYBaseSet"; break; default: segueID = @"showLegendarySet"; break; } [self performSegueWithIdentifier:segueID sender:self]; 保证返回有效的单元格,因此在调用该方法后检查dequeueReusableCellWithIdentifier:forIndexPath:是不必要的(假设您&# 39;重新定位旧iOS版本)。

我看到你只是在调用cell == nil,这有可能返回dequeueReusableCellWithIdentifier:。但是,您在已发布的代码中调用该方法两次,并且在nil数据源方法中都有tableView可用的方法,因此请充分利用它删除那些indexPath支票;它正在解放。

答案 1 :(得分:1)

试试这个,我自己还没有测试过代码,但它可以工作。

这是问题所在。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    /*
    // You got a problem with all these ifs and elses. 2 things are happening. 
    if (indexPath.row == 0) <----Is called
    {
        [self performSegueWithIdentifier:@"showFlashFireSet" sender:self];

    }
    if (indexPath.row == 1) <---also called
    {
        [self performSegueWithIdentifier:@"showXYBaseSet" sender:self];
    }
    else <--- this is also called. 
    {
        [self performSegueWithIdentifier:@"showLegendarySet" sender:self];
    } */



    if (indexPath.row == 0)
{
    [self performSegueWithIdentifier:@"showFlashFireSet" sender:self];
     break;
}
else if (indexPath.row == 1) // notice the else on this line
{
    [self performSegueWithIdentifier:@"showXYBaseSet" sender:self];
    break;
}
else
{
    [self performSegueWithIdentifier:@"showLegendarySet" sender:self];
     break;
}

}