类别标头导入无效

时间:2012-05-29 06:41:17

标签: objective-c categories objective-c-category

我有一个工作区,里面有两个项目。第一个项目本质上是一个测试和开发项目,在这里我开始工作,然后担心将所有东西捆绑在一起。第二个项目是将我所有单独开发的视图控制器放在一个故事板中。

在其中一个视图控制器上,我有一堆滑动手势,相当多的UIView动画调用格式良好,可读性,因此需要占用大量空间。我选择将它们作为一个类别移出。

问题是编译器没有在主头文件中看到实例变量声明。

我把头发拉出来的是我在第一个项目中做到了这一切并且一切正常。所以我正在仔细比较我的第二个项目的内容与第一个项目的内容,我认为没有差异。

以下是一些文件片段,用于帮助演示我在何处/何处定义内容,然后在尝试访问它们的类别文件中显示代码片段:

GSBViewController.h

@interface GSBViewController : UIViewController

@property (strong, nonatomic) IBOutlet UISegmentedControl *roundPicker;
@property (strong, nonatomic) IBOutlet UIView *roundsSectionView;

GSBViewController.m

#import "GSBViewController+Swipe.h"

@interface GSBGameBuilderViewController ()
{
    UIBarButtonItem *rightGatherBarButton;

    NSInteger previousRound;
}
@end

@implementation GSBViewController
@synthesize roundPicker;
@synthesize roundsSectionView;

GSBViewController + Swipe.h

#import "GSBViewController.h"

@interface GSBViewController (Swipe)

- (void)establishSwipeGestures;

@end

GSBViewController + Swipe.m

#import "GSBViewController+Swipe.h"

@implementation GSBViewController (Swipe)

- (void)establishSwipeGestures
{
    UISwipeGestureRecognizer *swipeLeft = 
       [[UISwipeGestureRecognizer alloc] 
           initWithTarget:self 
                   action:@selector(roundsSectionLeft:)];

    [swipeLeft setDirection:UISwipeGestureRecognizerDirectionLeft];
    [swipeLeft setNumberOfTouchesRequired:1];
    [roundsSectionView addGestureRecognizer:swipeLeft];
// bunch-o-code snipped -- for the time being it's actually all commented out
// as a test and because the LLVM compiler was giving up after too many errors
// and I wanted to see if there was more it would like to tell me about this first --
// and very representative -- problem.
}
@end

编译器的抱怨是“使用未声明的标识符'roundsSectionView'”

如果我选择 - 在我添加手势识别器的那行代码中单击使用roundsSectionView,弹出窗口正确描述它在GSBViewController.h中声明

所以我很难过。

我可以在Xcode中做些什么(发布时的4.3.2 :-)让我看看包含的文件是什么?或者是否有一些非基于文件的东西需要将一个类别绑定到它正在扩充的类中?我不记得之前有必要做的事。事实上,我为这个类别生成文件的方式是通过Xcode的文件 - >新文件... Objective-C类别模板。然后我只是复制旧的... + Swipe.h和... + Swipe.m文件的内容并将它们粘贴到新项目中的各自文件中。

2 个答案:

答案 0 :(得分:2)

合成的ivar是私人的。编译器不允许您在创建它的@implementation块中的任何位置访问它。类别和子类都不能直接访问ivar;他们必须使用该属性:[self roundsSectionView]

早期的Clangs没有将合成的ivars私有化的可能性很小。无论是那个还是你在早期的项目中并没有真正做同样的事情。

答案 1 :(得分:1)

@Jacques Cousteau所说的是正确的。

由于您刚刚定义了属性而没有支持ivar,因此该类别将无法访问它。如果您使用self.roundsSectionView,它将使用为该属性生成的getter方法,因此它将起作用。

或者您可以在界面中定义支持变量

@interface GSBViewController : UIViewController
{
    UIBarButtonItem *roundsSectionView;
}

在这种情况下,类别将能够访问变量。但不是任何其他类。