2

MainView(私のUIViewController)に表示するために、classAから呼び出してclassBでUIViewを作成したいと思います。

図

誰かが私のコードを修正するのを手伝ってくれますか?

クラスA:

+ (void)trigger
{
    [classB viewOn:[MainView new]];
}

クラスB:

+ (void)viewOn:(id)sender
{
    MainView *pointer = (MainView *)sender;

    classB *view = [[classB alloc] initWithFrame:CGRectMake(380, 200, 100, 50)];
    view.backgroundColor = [[UIColor greenColor] colorWithAlphaComponent:0.5f];
    view.userInteractionEnabled = YES;

    UILabel *lab = [UILabel new];
    lab.frame = CGRectMake(0, 0, 100, 50);
    lab.text = @"test";

    [view addSubview:lab];
    [pointer.view addSubview:view];
}

MainView クラスを使用して [classB viewOn:self] で classB を呼び出すと、正常に動作します。しかし、classA からトリガーしたい場合、どうすればよいでしょうか?

4

2 に答える 2

1

MainViewクラスを使用して[classBviewOn:self]でclassBを呼び出すと、正常に機能します。

これは、にキャストsenderしているためですMainView *

しかし、classAからトリガーしたい場合、どうすればよいですか?

ClassAから同じことをしたい場合は、渡すためにMainViewのインスタンスへのポインターが必要になります。あなたはすでにそれをやろうとしているようです...

[classB viewOn:[MainView new]];

これはおそらくMainViewを初期化する正しい方法ではありませんが、ビューは通常、その後に。がalloc続く形で初期化されinitWithFrame:ます。

これをすべて機能させるために多くの時間を費やす前に、オブジェクトがここで果たしているさまざまな役割について考える必要があります。通常、ビュー階層の作成と構成を管理するには、ビューコントローラーを使用します。ここでビューコントローラが役立つ1つの方法は、MainViewのインスタンスへの参照を保持することです。次に、View ControllerはClassBをインスタンス化し、その新しいビューをMainViewに追加できます。あなたはClassAをビューコントローラーとしてだけでなくビューとしても機能させようとしているようです-それはおそらく水を濁らせ、Objective-CとCocoaTouchで効果的に作業することを学ぶのをより難しくします。

于 2012-09-18T14:17:52.910 に答える
0

委任を使用します。それは非常に簡単です。に行くだけですClassA。このようにします

@interface ClassA: NSObject <ClassB>

から呼び出すことができるようになりましたClassA

私はobjective-cが初めてなので、私が助けてくれることを願っています。

于 2012-09-18T14:02:35.770 に答える