[英]Application crashes after trying to set typedef enum
我之前曾問過一個與此類似的問題,但是我有一個新問題,因此我重新發布了部分問題。
我的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];
}
作為我上面評論的后續內容:
您可能在某處說[[UIView alloc] initWithFrame:...]
,或者您有一個帶有View對象的Interface Builder文件。 如果您在檢查器窗口中選中該對象,則它將指示其“類標識”為UIView
。 將此更改為MainView
以便該對象在運行時具有正確的類型。
您需要在MainView
的@interface
部分內聲明屬性,以及Weather weather;
同樣需要在MainView
的實例變量部分中。
更新:在viewDidLoad中,您要將MainView作為子視圖添加到VCs view
屬性中。 然后,當您要使用它時,您將獲得VCs view
屬性,並將其強制轉換為MainView
。 這樣做時,您沒有得到想要的視圖。 您正在獲取保留MainView的視圖。 這是您問題的根源。 您所引用的self.view
是一個UIView而不是MainView。 MainView是self.view的子視圖。
您將MainView添加為self.view的子視圖。 傳遞setWeather時,實際上是在self.view(您的視圖控制器的主視圖,它是一個UIView)上調用它,而不是在self.view的MainView子視圖上調用它。
通過迭代self.view.subviews獲得正確的MainView對象。
編輯:或者只是保持一個ivar指向周圍的MainView子視圖,以便您可以隨時訪問它。
MainView *drawBox;
在.h中 drawBox = [[MainView alloc] initWithFrame:(CGRectMake(60, 80, 200, 200))];
[drawBox setWeather:CLEAR];
當你需要 在.m中,您是否綜合了天氣? 例如
@synthesize weather;
這樣就可以創建getter和setter了。
[更新]在viewdidload中讀取更新后,很明顯您訪問錯誤的視圖,因為您僅使用了[self.view addSubView:],這意味着self.view不是MainView,它只是一個子視圖。 您可以將MainView * drawBox聲明為全局變量,然后直接訪問[drawBox setWeather:]。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.