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

我在接口声明之前有这个 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 子视图,这样您就可以随时访问它。

  1. 宣布 MainView *drawBox; 在.h中
  2. 在viewDidLoad中,初始化为 drawBox = [[MainView alloc] initWithFrame:(CGRectMake(60, 80, 200, 200))];
  3. 只需致电 [drawBox setWeather:CLEAR]; 当你需要时

其他提示

作为后续于上述我的意见:

您很可能要么说[[UIView alloc] initWithFrame:...]地方,或者你有一个视图对象的Interface Builder的文件。如果你在选择的对象检查器窗口看,它会显示其“阶级”为UIView。更改为MainView所以对象将具有在运行时正确的类型。

您需要声明@interfaceMainView段内的财产,你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:]直接

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top