1

我之前问过一个类似的问题,但我有一个新问题,所以我重新发布了部分问题。

我在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

4 回答 4

3

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

您可能在[[UIView alloc] initWithFrame:...]某处说,或者您有一个带有 View 对象的 Interface Builder 文件。如果您在选中该对象的情况下查看检查器窗口,它会将其“类标识”指示为UIView. 将此更改为,MainView以便对象在运行时具有正确的类型。

于 2010-10-28T02:29:47.207 回答
1

您需要在 的@interface部分中声明属性MainView,并且您Weather weather;也需要在的实例变量部分中MainView

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

于 2010-10-28T02:10:47.280 回答
1

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

通过遍历 self.view.subviews 获取正确的 MainView 对象。

编辑:或者只保留一个指向 MainView 子视图的 ivar,这样您就可以随时访问它。

  1. MainView *drawBox;在 .h 中声明
  2. 在 viewDidLoad 中,初始化为drawBox = [[MainView alloc] initWithFrame:(CGRectMake(60, 80, 200, 200))];
  3. 只需[drawBox setWeather:CLEAR];在需要时调用
于 2010-10-28T02:44:41.457 回答
0

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

@synthesize weather; 

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

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

于 2010-10-28T02:11:35.330 回答