我已经学习了几周的Objective C,针对iPhone应用开发。今天我收到了我的配置文件,想把我的应用程序放在我的手机上。然而,当我将其构建为我的iPhone版本时,我得到了一系列相同类型的错误:
error: 'itemPickerView' undeclared (first use in this function)
当我在模拟器中构建时,这种情况不会发生。
所有错误都发生在单个类实现文件(ProjectSettingsController)中,该文件扩展了DetailController。
我有其他两个类也扩展了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个小时来查看这两个文件的细节,但无法找到任何导致此情况发生的原因。
我是否应该更改代码以使用属性?这将意味着需要在所有这些变量前面加上super.并浏览我的代码吗?不能从子类中访问实例变量似乎很荒谬(尤其是因为我似乎可以访问方法?!)
期待您告诉我错过的愚蠢之处。
self.
不是super.
.... 另外,Objective-C 有"实例变量",而不是"成员变量"。这只是一个小细节,但它会帮助您阅读文档时保持清晰。 - bbumsuper
并不是与self
分离的东西——它们都是指代当前对象的方式。编写super
和self
之间唯一的区别在于,当您将super
用作消息接收者时(例如,[super doSomething]
),运行时会跳过当前类中实现的方法,以尝试将该消息解析为方法调用。在消息发送之外编写super
是没有意义的。 - ChuckitemPickerView
吗?我不知道为什么你会在设备上出现错误而在模拟器上没有...就好像 ProjectSettingsController 可能被遗漏在构建中一样。 - jlstrecker