0

私のこの問題を除いて、それは非常にうまく機能すると思うので、私は見つけたこのコントロールをカスタマイズしています:

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が再びインスタンス化されるのはなぜだろうと思っていました(これは正しい用語ですか?)

編集:いくつかのコードを追加しました

4

1 に答える 1

1

それで私はついにそれを理解しました、そしてうまくいけば他の誰かがこれが役に立つと思うことができます。UiCollectionViewを生成するときは、何らかの理由でレイアウトを開始する必要があります。Idkなぜ、私は見つけようとします。しかし、これが私を解決策に導いたものです:

http://www.rqna.net/qna/ikvmhu-uicollectionview-must-be-initialized-with-a-non-nil-layout-parameter.html

FSVerticalTabbarが呼び出される前にメインViewControllerでCollectionViewControllerをインスタンス化する前は、ストーリーボードのViewControllerに接続されたクラスを使用していました。AdminMainController、AdminEventsCollectionControllerなど。

基本的に、レイアウトを追加し、開始時にUICollectionViewControllerに使用しました。これで、エラーなしでVCが削除されます。

UICollectionViewFlowLayout *aFlowLayout = [[UICollectionViewFlowLayout alloc] init];
 [aFlowLayout setItemSize:CGSizeMake(200, 140)];
 [aFlowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
myCollectionViewController = [[MyCollectionViewController alloc]initWithCollectionViewLayout:flowLayout];
于 2013-03-20T05:33:53.330 に答える