ViewController 中的 View 类正在发生变化?

Posted

技术标签:

【中文标题】ViewController 中的 View 类正在发生变化?【英文标题】:Class of View is changing in ViewController? 【发布时间】:2013-01-03 09:29:25 【问题描述】:

我的应用程序中有一个 ViewController,它具有在不同视图和标签栏之间切换的方法。为了能够在方法中切换视图,视图从它们的 nib 加载到 viewDidLoad 中。视图的切换基本上可以正常工作,但只有一个视图总是错误的。如果我检查可能是什么问题,我可以在日志中看到该视图的类在加载到 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;

【问题讨论】:

1.在loadTasteView中不需要循环查看。只需在 nibViews 的索引零处获取对象。 2.无需调用viewWillDisappear。这可能会导致问题。 1.并不真地。您不能确定视图始终位于索引零处。 2. 好的,查看 WillDisappear 并不是真的必要。但不调用它也无济于事...... 【参考方案1】:

与此同时,我为我的问题找到了一个很棒的解决方案,这简直令人难以置信:在我的一个视图类的头文件中,我为视图声明了一个错误的 IBOutlet!当我使用复制和粘贴时,我在标题中粘贴了另一个类的 IBOutlet。这让我相信这个对象会改变它的类!

【讨论】:

以上是关于ViewController 中的 View 类正在发生变化?的主要内容,如果未能解决你的问题,请参考以下文章

将数据从一个 ViewController 中的 UITextField 传递到另一个 View Controller 中的 UILabel

为 UIViewController 设置 ViewController,使用 Table View,连接到 Swift 中的 Parse

使用 Detail View 如何获取 Detail ViewController.m 文件中的选定行值?

自制一个UIView代替ViewController的导航栏视图跟随scrollview滑动而改变大小并且图片移动交错效果,列表的Header View中的图片产生视差滚动效果

SwiftUI3.0将UIKit ViewController转化成 swiftUI的view

viewController的生命周期