2011-12-20 67 views
0

这一个让我难住。我正在编写一个跟踪公交时刻表的iPhone应用程序。用户可以将他们最喜欢的公共汽车站加入书签,以便他们可以从主屏幕直接跳到他们。我管理的在我AppDelegate类收藏(无关的代码已经被删节)名单:为什么我从Xcode获得这个警告? iOS的代码似乎很好

@interface AppDelegate : NSObject <UIApplicationDelegate> 
+ (BOOL) isInFavorites: (FavoriteStopData*) inStop; 
@end 

我有提出了一个给定的公交线路的站名,并让用户选择一个看到预测总线视图控制器对于到达时间停在一个新的视图(可能停止添加到他们的收藏列表):

@implementation RouteStopsViewController 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    FavoriteStopData *stopData = [[FavoriteStopData alloc] init]; 
// ... set various properties in stopData from data in the selected cell 
    FavoriteStopViewController *fvc = [[FavoriteStopViewController alloc] initWithNibName:@"FavoriteStopViewController" bundle:nil]; 
    fvc.stop = stopData; 
    fvc.isBookmarked = [AppDelegate isInFavorites:stopData]; 
    [stopData release]; 
    [self.navigationController pushViewController:fvc animated:YES]; 
    [fvc release]; 
} 
@end 

线

fvc.isBookmarked = [AppDelegate isInFavorites:stopData]; 

得到两个警告:

“‘的AppDelegate’可能不+ isInFavorites回应:”
“传递的‘setIsBookmarked’参数1指针赋给整数,未作类型转换”

我看不到任何理由Xcode的思考“ + isInFavorites:'是未定义的,但它确实。我已验证了这些警告可能的原因事实上并非如此:

  • “+ isInFavorites:”在“AppDelegate.h”声明(如上图所示)

  • “RouteStopsViewController .M”并不#IMPORT “AppDelegate.h”(和 “FavoriteStopData.h” 和 “FavoriteStopViewController.h”)

  • 'isBookmarked' 是上FavoriteStopViewController

  • 的代码没有被公开BOOL属性被一些#define宏淹没;当我预处理“RouteStopsViewController.m”时,此代码不变。

代码行为正确,但我真的不想住在一起,我必须忽略每一个代码编译时间,以及禁止与一些的#pragma该警告的警告是路我宁愿不要除非必须采取。

我试图重新命名方法名,变量名,使用该方法来设置本地BOOL变量,然后设置与该属性,使用条件操作符(x和y:Z),以确保我m传递BOOL到属性...没有任何工作。那第一个警告永远不会消失。

任何人都可以提出为什么Xcode给我这个警告?

这是在运行Mac OS X 10.6.8(Snow Leopard)的MacBook Pro上的5.0 iPhone模拟器中运行的Xcode 4.2(Build 4C199)和iOS 5 SDK。

+0

从您使用isXXXX的方式来看,您似乎希望通过所需的BOOL语句传递除0或1(NO或YES)以外的数字。 – CodaFi 2011-12-20 04:54:52

+0

应该不是AppDelegate是UIResponder的子类,不是NSObject? – erdekhayser 2013-12-15 03:04:47

回答

0
的整个运行时间

找到了。即使是完美的感觉......现在我知道在哪里看。

我的项目有两个目标:Dev用于测试新代码的版本,App用于面向用户的版本。每个都有自己的AppDelegate类(和其他一些重复项)。特定于一个目标或另一个目标的代码进入./Dev/或./App/文件夹。常用的代码进入其他文件夹。

最近,我提出了一个开发人员特定的类在两个目标中使用...但尚未将文件移出Dev文件夹。这是我有问题的RouteStopsViewController。我的项目正在编译正确的“AppDelegate.m”,但Xcode发现“错误”(对我来说)“AppDelegate.h”,因为它首先在与“RouteStopsViewController.m”相同的文件夹中查找。

修复很简单:将RouteStopsViewController从Dev特定文件夹移出到两个目标共享的代码中。现在Xcode使用它正在编译的“AppDelegate.m”文件来查找匹配的“AppDelegate.h”。

我当时知道我应该移动RouteStopsViewController类,当我决定在App目标中重用它时,我只是没有理解它。谈到编写代码时,请相信你的鼻子。如果它闻起来很有趣,那很可能是。

2

如果编译器完全不知道+isInFavorites:方法,则会看到类似+isInFavorites: not found (return type defaults to 'id')的警告。

如果你没有看到该警告,那么我们可以假设编译器已经看到该方法的一个声明。但是,编译器希望此方法返回一个指针而不是BOOL,这就是您看到makes integer from pointer without a cast警告的原因。

检查项目中isInFavorites:方法的任何其他声明。检查名为AppDelegate的任何全局变量,这些变量可能与您的类名冲突。检查AppDelegate.h和RouteStopsViewController.h之间的任何循环导入。尝试重命名你的AppDelegate类。

0

在您的appdelegate.h文件中声明您的isInFavorites方法。

0

“的AppDelegate”可以不至+ isInFavorites响应:
传递参数1“setIsBookmarked”时将指针整数,未作铸造

第一误差引起的第二个。编译器的上+isInFavorites:存在混乱导致编译器假定返回类型为id

这一假设将导致使从指针整数的警告没有投

你真的把重点放在第一个警告。

这些是唯一的警告吗?

试着改变你的AppDelegate.h到

@class FavoriteStopData 
@interface AppDelegate : NSObject <UIApplicationDelegate> 
+ (BOOL) isInFavorites: (FavoriteStopData*) inStop; 
@end 

如果您仍然有问题,你可能要考虑使之成为一个实例方法,而不是考虑到的appDelegate是有效的您的应用程序

相关问题