将子视图添加到自定义类的超级视图不起作用

时间:2013-03-08 23:03:07

标签: iphone ios objective-c xcode cocoa-touch

我正在尝试学习如何创建一个自定义类,可以将子视图添加到它的超级视图中并相信我下面的代码应该可以工作,但它不是,我不明白为什么会弄明白。它成功构建并通过添加子视图运行,但我从未在模拟器上看到它。我希望有人能指出我正确的方向。

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

} 

2 个答案:

答案 0 :(得分:2)

这里有几个问题。我将从最糟糕的新第一开始。不支持子类UIAlertView,这不是一个好主意。

  

子类注释

     

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

- UIAlertView Class Reference

下一条坏消息,-initWithFrame:不是UIAlertView指定的初始化程序,不应使用。您需要使用-initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:

最后,现有UIAlertView的超级视图是_UIAlertNormalizingOverlayWindow_UIAlertNormalizingOverlayWindowUIWindow的子类型,没有超级视图。这意味着您所看到的警报与您的所有应用视图所在的窗口中不存在。

答案 1 :(得分:1)

我想知道UIAlertView Subclassing。

Developer.Apple清楚地说

  

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

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

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

因为您刚刚在Alerts中创建了mainviewcontroller类的对象。

Alerts类不会包含mainviewcontroller的任何视图层次结构。

为此,您必须使用mainviewcontrollerAlertsproperty传递给method 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];
}