3

私はここで多くの綿密な答えをチェックしてきました、誰も私の愚かな問題を解決することはできません。

私の問題は次のとおりです。UIViewControllerclassAとUIViewclassBの2つのクラスがあります。

ボタン(classA)がトリガーして処理(classB)し、画面にサブビューを表示します(classA)。しかし、それは機能しません。

classA .m:

@implementation ViewController
...

- (IBAction)trigger:(UIButton *)sender {
    [classB  makeViewOn];
}

classB .h:

#import <UIKit/UIKit.h>

@interface classB : UIView
+ (void)makeViewOn;

@end

classB .m:

#import "classB.h"

#import "ViewController.h"

@implementation classB

+ (void)makeViewOn
{        
    ViewController *pointer = [ViewController new];
    UIWindow *window = pointer.view.window;

    classB *overlayView = [[classB alloc] initWithFrame:window.bounds];
    overlayView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.5f];
    overlayView.userInteractionEnabled = YES;

    [pointer.view addSubview:overlayView];
}

@end

UIViewControllerという1つのクラスだけでこれを行うと、正常に機能します。ただし、これを2つの別々のクラス(UIViewControllerとUIView)で行う場合、どうすれば修正できますか?

クラス間のコミュニケーションの基本的な概念について何か間違ったことをしていますか?

どうもありがとう!

4

1 に答える 1

2

まず、クラスViewControllerのpointerという名前の新しいオブジェクトを作成しているため、classBオブジェクトoverlayViewはclassAのサブビューとしてではなく、オブジェクトpointerに追加されています。

次に、 window.boundsを印刷して確認すると、返される (null)。

classB のクラスメソッドを変更します

+ (void)makeViewOnParentView:(id)sender;

+ (void)makeViewOnParentView:(id)sender
{        
        ViewController *pointer = (ViewController*)sender;
        //UIWindow *window = pointer.view.window;
        CGRect rect=pointer.view.frame;

        classB *overlayView = [[classB alloc] initWithFrame:CGRectMake(0, 0,rect.size.width, rect.size.height)];
        overlayView.backgroundColor = [[UIColor greenColor] colorWithAlphaComponent:0.5f];
        overlayView.userInteractionEnabled = YES;

        [pointer.view addSubview:overlayView];
}

そしてあなたのclassAでメソッドを呼び出します

[classB makeViewOnParentView:self];

これがうまくいくことを願っています...

于 2012-09-16T06:29:26.653 に答える