簡體   English   中英

嘗試設置typedef枚舉后,應用程序崩潰

[英]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子視圖,以便您可以隨時訪問它。

  1. 聲明MainView *drawBox; 在.h中
  2. 在viewDidLoad中,初始化為drawBox = [[MainView alloc] initWithFrame:(CGRectMake(60, 80, 200, 200))];
  3. 只需調用[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM