我完全陷入困境。我一直在寻找答案,似乎每个人都有一个不同的问题,每个“嵌套推送动画可能会导致导航栏损坏”错误。
请记住,我正在尝试自学如何为iOS 7编写代码。因此,如果我的某些编码方法不理想,我很抱歉,请提供反馈。无论如何,我正在创建一个口袋妖怪交易卡游戏Pokedex应用程序,显示最新集的卡。除了在主屏幕上选择第一个表格单元格(XY Flash Fire)时,一切都完美无缺。它将显示正确的表格数据,但导航栏标题不正确。当我选择一行时,它也不会去PokedexDetailViewController。
同样,主屏幕中的所有其他表格单元格都没有问题。我还尝试了其他人在这里发布的修补程序和类以及github,但没有一个对我有效。我还重新创建了整个FlashFireViewController并仍然遇到了同样的问题。确保所有代码与其他工作视图控制器完全相同。还验证了segue来自Set View Controller,与细胞相对。但是,一旦它在Flash Fire View Controller中,segue就来自单元格。
暂不发布照片了,所以这是我的屏幕截图的专辑链接:http://imgur.com/a/Dq9py
以下是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:
答案 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;
}
}