之前我曾问过类似的问题,但我遇到了一个新问题,所以我转发了部分问题。
我在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];
}
答案 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子视图,这样您就可以随时访问它。
MainView *drawBox;
drawBox = [[MainView alloc] initWithFrame:(CGRectMake(60, 80, 200, 200))];
[drawBox setWeather:CLEAR];
即可
醇>
答案 3 :(得分:0)
@synthesize weather;
这样你就可以创建getter和setter了。
[update]在viewdidload中读取更新后,很明显你正在访问错误的视图,因为你只是使用[self.view addSubView:],这意味着self.view不是MainView,它只是一个子视图。您可以将MainView * drawBox声明为全局并直接访问[drawBox setWeather:]。