0

私のアプリには、タブバーのさまざまなビューを切り替えるメソッドを持つViewControllerがあります。メソッドでビューを切り替えることができるようにするために、ビューはペン先からviewDidLoadにロードされます。ビューの切り替えは基本的には正常に機能しますが、1つのビューだけが常に間違っています。何が問題であるかを確認すると、このビューのクラスがviewDidLoadにロードされた後に変更されることがログで確認できます。一般に、オブジェクトがそのクラスを変更した場合、不思議な魔法はありません。何かが起こらなければなりません。ビューが読み込まれた後、どうなるのでしょうか。もう少し正確に言うと、「魔法」を実行するコードは次のとおりです。ビューはviewDidLoadにロードされます

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setCurrentView:placeholder];
    [self configureView];
    wineryView = [self loadWineryView];
    DLog(@"- %@", [wineryView class]);
    wineView = [self loadWineView];
    DLog(@"- %@", [wineView class]);
    tasteView = [self loadTasteView];
    DLog(@"- %@", [tasteView class]);
}

ログには常に期待される正しいクラスが表示されます。その後、ビューを変更するメソッドがあります。

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
{
    DLog(@"- %d", item.tag);
    [[self currentView] removeFromSuperview];

    switch ([item tag])
    {
        case TAB_WINERY:
            if (self)
            {
               [self viewWillDisappear:YES];
               [[self view] addSubview:wineryView];
               DLog(@"- %@", [wineryView class]);
               [self setCurrentView:wineryView];
            }
            break;
        case TAB_WINE:
            if (self)
            {
                [self viewWillDisappear:YES];
                [[self view] addSubview:wineView];
                DLog(@"- %@", [wineView class]);
                [self setCurrentView:wineView];
            }
            break;
        case TAB_TASTE:
            if (self)
            {
                [self viewWillDisappear:YES];
                [[self view] addSubview:tasteView];
                DLog(@"- %@", [tasteView class]);
                [self setCurrentView:tasteView];
            }
        default:
            break;
        }
    }

その時点で、ログには期待される結果が表示されません。これが私のログの抜粋です:

2013-01-03 10:20:52.032 Weinerei[454:c07] -[DetailViewController viewDidLoad] [Line 51] - WineryView
2013-01-03 10:20:52.034 Weinerei[454:c07] -[DetailViewController viewDidLoad] [Line 53] - WineView
2013-01-03 10:20:52.036 Weinerei[454:c07] -[DetailViewController viewDidLoad] [Line 55] - TasteView
2013-01-03 10:20:58.946 Weinerei[454:c07] -[DetailViewController tabBar:didSelectItem:] [Line 89] - 0
2013-01-03 10:20:58.948 Weinerei[454:c07] -[DetailViewController tabBar:didSelectItem:] [Line 100] - TasteView
2013-01-03 10:21:00.378 Weinerei[454:c07] -[DetailViewController tabBar:didSelectItem:] [Line 89] - 1
2013-01-03 10:21:00.380 Weinerei[454:c07] -[DetailViewController tabBar:didSelectItem:] [Line 109] - WineView
2013-01-03 10:21:03.306 Weinerei[454:c07] -[DetailViewController tabBar:didSelectItem:] [Line 89] - 2
2013-01-03 10:21:03.308 Weinerei[454:c07] -[DetailViewController tabBar:didSelectItem:] [Line 119] - TasteView

コード内のどこでもビューオブジェクトのクラスを変更しないので、なぜこれが発生するのかわかりません。誰かがこれの理由とこれを回避する方法を知っていますか?ロード中にクラスを変更しないことを示すために、ビューをロードするためのメソッドの例を次に示します。

- (UIView *) loadTasteView
{
    NSArray *nibViews = [[NSBundle mainBundle] loadNibNamed:@"TasteView" owner:self options:nil];
    TasteView *tView;
    for (id view in nibViews) {
        if ([view isKindOfClass:[TasteView class]]) 
        {
            tView = (TasteView*) view;
        }
    }
    return tView;
}
4

1 に答える 1

0

その間、私は自分の問題に対する素晴らしい解決策を見つけました。これは信じられないほどです。ビュークラスの1つのヘッダーファイルで、ビューに対して間違ったIBOutletを宣言しました。コピー&ペーストで作業しているときに、別のクラスのIBOutletをヘッダーに貼り付けました。これにより、オブジェクトがそのクラスを変更すると私は信じました!

于 2013-01-03T14:45:59.117 に答える