私のこの問題を除いて、それは非常にうまく機能すると思うので、私は見つけたこのコントロールをカスタマイズしています:
http://www.cocoacontrols.com/controls/fsverticaltabbarcontroller
サイドバーでアイテムがタップされるたびに、通常のViewControllerの代わりにUICOllectionViewCOntrollerをロードしたかったのです。だから私はアイテムを選択するときにこの変更を行いました:
- (void)setSelectedIndex:(NSUInteger)selectedIndex
{
NSLog(@"selected Index is %@", [NSNumber numberWithInt:selectedIndex]);
NSLog(@"_selected Index is %@", [NSNumber numberWithInt:_selectedIndex]);
NSLog(@"vc counts is %i", [self.viewControllers count]);
if (selectedIndex != _selectedIndex && selectedIndex < [self.viewControllers count])
{
// add new view controller to hierarchy
UIViewController *selectedViewController = [self getSelectedVCWithSelectedIndex:selectedIndex];
[self addChildViewController:selectedViewController];
selectedViewController.view.frame = CGRectMake(self.tabBarWidth,
0,
self.view.bounds.size.width-self.tabBarWidth,
self.view.bounds.size.height);
selectedViewController.view.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
[self.view addSubview:selectedViewController.view];
// remove previously selected view controller (if any)
if (_selectedIndex != NSNotFound)
{
UIViewController *previousViewController = [self.viewControllers objectAtIndex:_selectedIndex];
NSLog(@"ERROR HERE: remove previous: previousVC = %@", previousViewController);
[previousViewController.view removeFromSuperview];
[previousViewController removeFromParentViewController];
}
// set new selected index
_selectedIndex = selectedIndex;
// update tab bar
if (selectedIndex < [self.tabBar.items count])
{
self.tabBar.selectedItem = [self.tabBar.items objectAtIndex:selectedIndex];
}
// inform delegate
if ([self.delegate respondsToSelector:@selector(tabBarController:didSelectViewController:)])
{
[self.delegate tabBarController:self didSelectViewController:selectedViewController];
}
}
}
サイドバーのアイテムのインデックス番号をすでに処理しているので、この行を使用してロードする必要のあるコントローラーのタイプをインスタンス化することを確認しました。3つの通常のVCと1つのコレクションVCがあります。
UIViewController *previousViewController = [self.viewControllers objectAtIndex:_selectedIndex];
これはどのように見えるかです:
-(UIViewController *)getSelectedVCWithSelectedIndex:(NSUInteger)selectedIndex{
UIViewController *selectedVC = [[UIViewController alloc]init];
// do a switch case on this.
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
// need to instantiate each and every custom uinav
switch(selectedIndex){
case 1:
selectedVC = [storyboard instantiateViewControllerWithIdentifier:@"UINavAdminCategoryIndexViewControllerID"];
break;
case 2:
selectedVC = [storyboard instantiateViewControllerWithIdentifier:@"UINavAdminParticipantIndexViewControllerID"];
break;
case 3:
selectedVC = [storyboard instantiateViewControllerWithIdentifier:@"UINavAdminTablesIndexCollectionViewControllerID"];
break;
case 4:
selectedVC = [self.viewControllers objectAtIndex:selectedIndex];
break;
default:
break;
}
return selectedVC;
}
これですべてがスムーズに読み込まれますが、 [コレクションVC ]タブに移動し、別のタブに移動してそこから離れると、次のエラーがスローされます。
*キャッチされなかった例外によるアプリの終了'NSInvalidArgumentException'、理由:'UICollectionViewはnil以外のレイアウトパラメーターで初期化する必要があります'
スーパービューから削除すると、アプリケーションがこの部分を爆撃します。
[previousViewController.view removeFromSuperview];
スタックからUIViewを削除するだけで、UIViewが再びインスタンス化されるのはなぜだろうと思っていました(これは正しい用語ですか?)
編集:いくつかのコードを追加しました