1

以前にこれに似た質問をしたことがありますが、新しい問題が発生したため、質問の一部を再投稿しました。

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];
}
4

4 に答える 4

3

上記の私のコメントのフォローアップとして:

おそらく[[UIView alloc] initWithFrame:...]どこかで言っているか、Viewオブジェクトを含むInterfaceBuilderファイルがあります。そのオブジェクトが選択された状態でインスペクターウィンドウを見ると、その「クラスID」がとして示されUIViewます。これをに変更しMainViewて、オブジェクトが実行時に正しいタイプになるようにします。

于 2010-10-28T02:29:47.207 に答える
1

@interfaceのセクション内でプロパティを宣言する必要がMainViewあります。Weather weather;また、のインスタンス変数セクション内にある必要がありますMainView

更新:viewDidLoadで、メインビューをサブビューとしてVCviewプロパティに追加しています。次に、それを使用する場合は、VCviewプロパティを取得し、それをにキャストしMainViewます。そうすると、必要なビューが得られません。MainViewを保持しているビューを取得しています。これが問題の原因です。self.viewあなたがそれを参照しているように、それはMainViewではなくUIViewです。MainViewは、self.viewのサブビューです。

于 2010-10-28T02:10:47.280 に答える
1

mainViewをself.viewのサブビューとして追加しました。setWeatherを渡すと、実際には、self.viewのMainViewサブビューではなく、self.view(UIViewであるView Controllerのメインビュー)で呼び出しています。

self.view.subviewsを反復処理して、正しいMainViewオブジェクトを取得します。

編集:または、ivarがMainViewサブビューを指しているだけにして、いつでもアクセスできるようにします。

  1. MainView *drawBox;.hで宣言する
  2. viewDidLoadで、init asdrawBox = [[MainView alloc] initWithFrame:(CGRectMake(60, 80, 200, 200))];
  3. [drawBox setWeather:CLEAR];必要なときに電話するだけです
于 2010-10-28T02:44:41.457 に答える
0

.mで天気を合成しましたか?例えば

@synthesize weather; 

ゲッターとセッターを作成できるようにします。

[update] viewdidloadで更新を読んだ後、[self.view addSubView:]を使用しただけで、間違ったビューにアクセスしていることがわかります。これは、self.viewがMainViewではなく、単なるサブビューであることを意味します。MainView * drawBoxをグローバルとして宣言し、[drawBox setWeather:]に直接アクセスできます。

于 2010-10-28T02:11:35.330 に答える