尝试设置typedef枚举后应用程序崩溃

时间:2010-10-28 02:07:48

标签: iphone objective-c enums typedef getter-setter

之前我曾问过类似的问题,但我遇到了一个新问题,所以我转发了部分问题。

我在MainView.h标题中的接口声明之前有这个。

typedef enum { UNKNOWN, CLEAR, NIGHT_CLEAR, CLOUDY, NIGHT_CLOUDY } Weather;

然后我(在我的MainView中)声明它:

Weather weather;

然后制作了一个存取器(并合成它):

@property Weather weather;

我的问题是,我怎样才能在MainViewController中使用它而不会崩溃? 我已经为MainView导入了标题。 我试着像这样使用它:

MainView* myView = (MainView*)self.view;

[myView setWeather: CLEAR];

它不会在Xcode中引发任何错误,但在代码运行时它会崩溃,并说:

-[UIView setWeather:]: unrecognized selector sent to instance *blah*

我在这里做错了吗?

在我的MainViewController中:

- (void)viewDidLoad {
    [super viewDidLoad];
    MainView * drawBox = [[MainView alloc] initWithFrame:(CGRectMake(60, 80, 200, 200))];
    drawBox.backgroundColor = [UIColor clearColor];
    [self.view addSubview:drawBox];
}

4 个答案:

答案 0 :(得分:3)

作为我上述评论的后续行动:

你可能要么在某个地方说[[UIView alloc] initWithFrame:...],要么你有一个带有View对象的Interface Builder文件。如果您在检查器窗口中查看选定的对象,则会将其“类标识”指示为UIView。将其更改为MainView,以便对象在运行时具有正确的类型。

答案 1 :(得分:1)

您需要在@interface的{​​{1}}部分内声明该属性,并且您的MainView也需要位于Weather weather;的实例变量部分。

更新:在viewDidLoad中,您将MainView作为子视图添加到您的VC MainView属性中。然后,当您想要使用它时,您将获得VC view属性,并将其转换为view。当你这样做时,你没有得到你想要的视图。您正在获取持有MainView的视图。这是您的问题的根源。你引用它时MainView是一个UIView而不是MainView。 MainView是self.view的子视图。

答案 2 :(得分:1)

您将MainView添加为self.view的子视图。当您传递setWeather时,实际上是在self.view(视图控制器的主视图,这是一个UIView)上调用它,而不是在self.view的MainView子视图上。

通过迭代self.view.subviews获取正确的MainView对象。

编辑: 或者只是将ivar指向MainView子视图,这样您就可以随时访问它。

  1. 在.h
  2. 中声明MainView *drawBox;
  3. 在viewDidLoad中,init为drawBox = [[MainView alloc] initWithFrame:(CGRectMake(60, 80, 200, 200))];
  4. 只需在需要
  5. 时拨打[drawBox setWeather:CLEAR];即可

答案 3 :(得分:0)

在.m你是否合成了天气?例如

@synthesize weather; 

这样你就可以创建getter和setter了。

[update]在viewdidload中读取更新后,很明显你正在访问错误的视图,因为你只是使用[self.view addSubView:],这意味着self.view不是MainView,它只是一个子视图。您可以将MainView * drawBox声明为全局并直接访问[drawBox setWeather:]。