【问题标题】:No Visible Interface -TabBarController没有可见界面 -TabBarController
【发布时间】:2013-04-21 17:05:13
【问题描述】:

我有一个有趣的问题,但我无法提出任何解决方案。

我的问题是我在主视图控制器上创建了 tabBarController,每当用户单击一个或另一个时,它都会调用相应的视图控制器并使用 [startFetchingFromServer] 方法从服务器获取数据。但是,我收到一个错误“UIViewcontroller 声明 startFetching 方法没有可见的@interface”。

在 h.file 中

@property (nonatomic, retain) IBOutlet UITabBarController *opponentInfoTabBarController;

在 m.file 中

if((opponentInfoTabBarController.selectedViewController == objOpponentInfoSettingsViewController) || (opponentInfoTabBarController.selectedViewController == objOpponentInfoBuddiesViewController))
    {
        [opponentInfoTabBarController.selectedViewController startFetchingFromServer];
    }

【问题讨论】:

    标签: interface-builder uitabbarcontroller


    【解决方案1】:

    1) 确保 startFetchingFromServer 在您 selectedViewControllers 的头文件中声明(objOpponentInfoSettingsViewController.h 和 objOpponentInfoBuddiesViewController.h)

    2) 将您的 SelectedViewController 转换为适当的类。它是 UIViewController,因此您的编译器正在 UIViewController.h 中查找 startFetchingFromServer 方法声明,而您希望它查看您的自定义类。

    if(opponentInfoTabBarController.selectedViewController == objOpponentInfoSettingsViewController)
        {
            (objOpponentInfoSettingsViewController *)[opponentInfoTabBarController.selectedViewController startFetchingFromServer];
        }
     else if(opponentInfoTabBarController.selectedViewController == objOpponentInfoBuddiesViewController)
        {
            (objOpponentInfoBuddiesViewController *)[opponentInfoTabBarController.selectedViewController startFetchingFromServer];
        }
    

    希望这会有所帮助!

    编辑: 更好的是检查 selectedViewController 是否属于特定类:

    if(opponentInfoTabBarController.selectedViewController isKindOfClass: [OpponentInfoSettingsViewController class])
        {
            (OpponentInfoSettingsViewController *)[opponentInfoTabBarController.selectedViewController startFetchingFromServer];
        }
     else if(opponentInfoTabBarController.selectedViewController isKindOfClass: [OpponentInfoBuddiesViewController class])
        {
            (OpponentInfoBuddiesViewController *)[opponentInfoTabBarController.selectedViewController startFetchingFromServer];
        }
    

    这样,您不必维护对您的实例的全局引用,只需调用“startFetchingFromServer”方法即可。

    您可以通过在调用“startFetchingFromServer”选择器之前添加对“startFetchingFromServer”选择器的检查来使这段代码更加健壮。

    类似:

       if ([theViewController respondsToSelector:@selector(startFetchingFromServer)]){
           [theViewController startFetchingFromServer];
       }
    

    【讨论】:

    • if(opponentInfoTabBarController.selectedViewController == objOpponentInfoSettingsViewController) { [objOpponentInfoSettingsViewController startFetchingFromServer]; } else if(opponentInfoTabBarController.selectedViewController == objOpponentInfoBuddiesViewController) { [objOpponentInfoBuddiesViewController startFetchingFromServer]; }
    • 你好 Calvin,我已经更新了上面的代码。你认为这是解决问题的正确方法。顺便说一句,非常感谢。
    • 如果您的代码是指相同的设置/好友视图控制器的实例,那么它的罚款。我仍然更喜欢检查所选视图控制器是否属于特定类,然后在 selectedViewController 上调用该类的方法。
    猜你喜欢
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    相关资源
    最近更新 更多