尝试设置 typedef 枚举后应用程序崩溃
-
27-09-2019 - |
题
我之前曾问过类似的问题,但我遇到了一个新问题,所以我重新发布了部分问题。
我在接口声明之前有这个 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];
}
解决方案
您将 MainView 添加为 self.view 的子视图。当你传递setWeather时,你实际上是在self.view(视图控制器的主视图,它是一个UIView)上调用它,而不是在self.view的MainView子视图上调用它。
通过迭代 self.view.subviews 获取正确的 MainView 对象。
编辑:或者只保留一个 ivar 指向 MainView 子视图,这样您就可以随时访问它。
- 宣布
MainView *drawBox;
在.h中 - 在viewDidLoad中,初始化为
drawBox = [[MainView alloc] initWithFrame:(CGRectMake(60, 80, 200, 200))];
- 只需致电
[drawBox setWeather:CLEAR];
当你需要时
其他提示
作为后续于上述我的意见:
您很可能要么说[[UIView alloc] initWithFrame:...]
地方,或者你有一个视图对象的Interface Builder的文件。如果你在选择的对象检查器窗口看,它会显示其“阶级”为UIView
。更改为MainView
所以对象将具有在运行时正确的类型。
您需要声明@interface
的MainView
段内的财产,你Weather weather;
需要在MainView
,以及实例变量部分。
更新:在您的viewDidLoad,您要添加您的MainView作为一个子视图到您的VC view
财产。然后,当你想使用它,你得到的风险投资view
属性,并将其强制转换为MainView
。当你这样做,你没有得到你想要的视图。你得到的控股您的MainView的看法。这是你的问题的根源。 self.view
为你引用它,是一个UIView不是的MainView。所述的MainView是self.view的子视图。
在.M你合成的天气?例如
@synthesize weather;
所以,你必须创建的getter和setter。
[更新]在viewDidLoad中读您的更新后,很明显,你正在访问错误的观点,因为你只需使用[self.view addSubView:],这意味着self.view不是的MainView,它只是一个子视图。你可以只申报的MainView * drawBox作为一个全球性和访问[drawBox setWeather:]直接