0

スーパービューにサブビューを追加できるカスタムクラスを作成する方法を学ぼうとしていますが、以下のコードは機能するはずですが、そうではなく、理由を理解するのに十分な理解がありません。正常にビルドされ、サブビューの追加が実行されますが、シミュレーターには表示されません。私は誰かが私を正しい方向に向けることができることを望んでいました。

mainviewcontroller.mは#alerts.hをインポートし、実行を試みます

Alerts* al = [[Alerts alloc] initWithFrame:[self.view bounds]];

[al throwBottomAlert:@"message" withTitle:@"Title Test"];

そして私のカスタムクラスでは...

ヘッダーファイル

#import <UIKit/UIKit.h>

@interface Alerts : UIAlertView

- (void)throwBottomAlert:(NSString*)message withTitle:(NSString*)title;


@end

実装ファイル

#import "Alerts.h"

@implementation Alerts

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

- (void)throwBottomAlert:(NSString*)message withTitle:(NSString*)title {

    UIView* alertView = [[UIView alloc] initWithFrame:[self bounds]];
    alertView.backgroundColor = [UIColor blackColor];

    [self.superview addSubview:alertView];
    [self.superview bringSubviewToFront:alertView];

} 
4

2 に答える 2

2

ここにはいくつかの問題があります。最悪の新しいものから始めましょう。サブクラス化UIAlertViewはサポートされておらず、実際には良い考えではありません。

サブクラス化ノート

UIAlertViewクラスは、そのまま使用することを目的としており、サブクラス化をサポートしていません。このクラスのビュー階層はプライベートであり、変更しないでください。

—UIAlertViewクラスリファレンス

次の悪いニュースは、-initWithFrame:UIAlertView指定された初期化子ではないため、使用しないでください。を使用する必要があります-initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:

最後に、既存のスーパービューはUIAlertViewです_UIAlertNormalizingOverlayWindow。これ_UIAlertNormalizingOverlayWindowはのサブタイプでUIWindowあり、スーパービューはありません。これは、表示されているアラートが、すべてのアプリが表示するのと同じウィンドウに存在しないことを意味します。

于 2013-03-08T23:33:06.880 に答える
1

UIAlertViewサブクラス化について疑問に思います。

Developer.Appleははっきりと言っています

UIAlertViewクラスは、そのまま使用することを目的としており、サブクラス化をサポートしていません。このクラスのビュー階層はプライベートであり、変更しないでください。

サブクラス化を無視した後、私は以下の答えを与えるつもりです。

あなたのコードでself.superviewは、mainviewcontroller

Alertsでクラスのオブジェクトを作成したためですmainviewcontroller

Alertsクラスには、。を使用したビュー階層はありませんmainviewcontroller

これを行うには、またはを使用してmainviewcontrollertoをAlertsクラスに渡す必要があります。propertymethod parameter

例:

mainviewcontroller

Alerts* al = [[Alerts alloc] initWithFrame:[self.view bounds]];

[al throwBottomAlert:@"message" withTitle:@"Title Test" ParentView:self.view];

アラート

- (void)throwBottomAlert:(NSString*)message withTitle:(NSString*)title ParentView:(UIView *)parentView

{
    UIView* alertView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
    alertView.backgroundColor = [UIColor blackColor];
    [parentView addSubview:alertView];
    [parentView bringSubviewToFront:alertView];
}
于 2013-03-08T23:34:27.523 に答える