我有一个有趣的问题,我无法提出任何解决方案。
我的问题是我在主视图Controller上创建了tabBarController,每当用户点击其中一个时,它就会调用相应的viewcontroller并使用[startFetchingFromServer]方法从服务器获取数据。但是,我收到错误“No Visible @interface for”UIViewcontroller声明了startFetching方法“。
h.file中的
@property (nonatomic, retain) IBOutlet UITabBarController *opponentInfoTabBarController;
m.file中的
if((opponentInfoTabBarController.selectedViewController == objOpponentInfoSettingsViewController) || (opponentInfoTabBarController.selectedViewController == objOpponentInfoBuddiesViewController))
{
[opponentInfoTabBarController.selectedViewController startFetchingFromServer];
}
答案 0 :(得分:1)
1)确保在selectedViewControllers的头文件中声明了startFetchingFromServer(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”选择器的检查,可以使这块代码更加健壮。
类似的东西:
if ([theViewController respondsToSelector:@selector(startFetchingFromServer)]){
[theViewController startFetchingFromServer];
}