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:.

最后,现有的 superviewUIAlertView是一个_UIAlertNormalizingOverlayWindow. 那_UIAlertNormalizingOverlayWindow是一个子类型,UIWindow没有超级视图。这意味着您看到的警报不存在于所有应用程序查看的同一窗口中。

于 2013-03-08T23:33:06.880 回答
1

我想知道 UIAlertView 的子类化。

Developer.Apple 明确表示

UIAlertView 类旨在按原样使用,不支持子类化。此类的视图层次结构是私有的,不得修改。

忽略子类化后,我将在下面给出答案。

在您的代码中,self.superview不是指mainviewcontroller

因为您刚刚Alertsmainviewcontroller.

Alerts类将没有任何视图层次结构mainviewcontroller

为此,您必须使用或传递mainviewcontrollerto类。Alertspropertymethod parameter

例子:

主视图控制器

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 回答