从其子级访问父类的实例变量

时间:2011-07-27 20:24:31

标签: iphone objective-c oop

我已经为iPhone学习了Objective C几周了,今天我已经完成了我的配置文件,所以想把我的应用程序放在我的手机上。然而,当我为我的iPhone构建它时,我得到了一个类型的错误列表(几乎相同):

error: 'itemPickerView' undeclared (first use in this function)

当我为模拟器构建时,这不会发生。

错误都发生在扩展DetailController的单个类实现文件(ProjectSettingsController)中。

我还有另外两个类也扩展了DetailController,并使用与ProjectSettingsController相同的实例变量,但它们不会导致错误。

ProjectSettingsController略有不同,因为它管理的视图永远不会直接添加到导航控制器,但编译器当时不知道这一点,并且它在模拟器上正常工作(两者都运行IOS 4.3)

我想我的问题有两个:

  1. 为什么在编译设备时会出现编译器错误,而不是在编译模拟器时?

  2. 为什么它只给我这个错误,只在这一类上?

  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个小时了,并且找不到任何理由为什么会发生这种情况。

    我是否应该更改代码以使用属性,然后通过我的代码并放置一个超级代码。在所有这些变量面前?从子类中访问实例变量似乎很愚蠢(特别是因为我似乎能够访问这些方法?!)

    我期待被告知我错过了什么愚蠢的事情

1 个答案:

答案 0 :(得分:1)

通常,当您将构建更改为目标模拟器或设备时,您可以更改#import或#include的系统头文件的来源。这些头文件的差异可能是模拟器或设备构建之间的变化。

每当您突然收到编译错误列表时,请关注第一个错误。通常,单个错误可能会导致进一步错误,并迅速级联到一个巨大的列表中。有时修复第一个错误会修复所有其他错误。