我已经为iPhone学习了Objective C几周了,今天我已经完成了我的配置文件,所以想把我的应用程序放在我的手机上。然而,当我为我的iPhone构建它时,我得到了一个类型的错误列表(几乎相同):
error: 'itemPickerView' undeclared (first use in this function)
当我为模拟器构建时,这不会发生。
错误都发生在扩展DetailController的单个类实现文件(ProjectSettingsController)中。
我还有另外两个类也扩展了DetailController,并使用与ProjectSettingsController相同的实例变量,但它们不会导致错误。
ProjectSettingsController略有不同,因为它管理的视图永远不会直接添加到导航控制器,但编译器当时不知道这一点,并且它在模拟器上正常工作(两者都运行IOS 4.3)
我想我的问题有两个:
为什么在编译设备时会出现编译器错误,而不是在编译模拟器时?
为什么它只给我这个错误,只在这一类上?
这是DetailController的.h
@interface DetailController : UITableViewController<UIPickerViewDelegate,UIPickerViewDataSource> {
NSMutableDictionary * data;
NSMutableArray * dataOrder;
NSMutableDictionary * objectToData;
UIDatePicker * pickerView;
UIPickerView * itemPickerView;
UIBarButtonItem * doneButton;
UIBarButtonItem * savedRightButton;
UIBarButtonItem * savedLeftButton;
UIBarButtonItem * insertButton;
UIView * slidingView;
UITextView * textView;
BOOL isEditing;
}
这是ProjectSettingsController的.h
#import <UIKit/UIKit.h>
#import "DetailController.h"
#import "Project.h"
#import "Task.h"
@class ProjectController;
@interface ProjectSettingsController : DetailController{
}
@property (nonatomic, retain) ProjectController* parent;
@property (nonatomic, retain) UINavigationController * navigationController;
@property (nonatomic, retain) UINavigationItem * navigationItem;
@property (nonatomic, retain) Project* project;
ProjectController被声明为一个类,而不是包含它,因为它已经包含了这个类。我已经尝试将DetailController添加为@class它没有做任何事情,正如我预期的那样。
以下是来自ProjectSettingsController.m的一段违规代码片段
int hours = [itemPickerView selectedRowInComponent: 0] + 1;
这是正确运行的TaskController的.h
#import "DetailController.h"
#import "Task.h"
#import "Project.h"
#import "CompletionSlider.h"
@interface TaskController : DetailController{
}
这是一个来自TaskController.m的代码片段。
[itemPickerView selectedRowInComponent:0]+1]
我已经查看了两个文件的细节,现在大约2个小时了,并且找不到任何理由为什么会发生这种情况。
我是否应该更改代码以使用属性,然后通过我的代码并放置一个超级代码。在所有这些变量面前?从子类中访问实例变量似乎很愚蠢(特别是因为我似乎能够访问这些方法?!)
我期待被告知我错过了什么愚蠢的事情
答案 0 :(得分:1)
通常,当您将构建更改为目标模拟器或设备时,您可以更改#import或#include的系统头文件的来源。这些头文件的差异可能是模拟器或设备构建之间的变化。
每当您突然收到编译错误列表时,请关注第一个错误。通常,单个错误可能会导致进一步错误,并迅速级联到一个巨大的列表中。有时修复第一个错误会修复所有其他错误。