我正在尝试学习如何创建一个自定义类,可以将子视图添加到它的超级视图中并相信我下面的代码应该可以工作,但它不是,我不明白为什么会弄明白。它成功构建并通过添加子视图运行,但我从未在模拟器上看到它。我希望有人能指出我正确的方向。
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];
}
答案 0 :(得分:2)
这里有几个问题。我将从最糟糕的新第一开始。不支持子类UIAlertView
,这不是一个好主意。
子类注释
UIAlertView类旨在按原样使用,不支持子类化。此类的视图层次结构是私有的,不得修改。
下一条坏消息,-initWithFrame:
不是UIAlertView
指定的初始化程序,不应使用。您需要使用-initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:
。
最后,现有UIAlertView
的超级视图是_UIAlertNormalizingOverlayWindow
。 _UIAlertNormalizingOverlayWindow
是UIWindow
的子类型,没有超级视图。这意味着您所看到的警报与您的所有应用视图所在的窗口中不存在。
答案 1 :(得分:1)
我想知道UIAlertView Subclassing。
Developer.Apple清楚地说
UIAlertView类旨在按原样使用,但不是 支持子类化。此类的视图层次结构是私有的 不得修改。
在忽略子类之后,我将在下面给出答案。
在您的代码中,self.superview
不是指mainviewcontroller
因为您刚刚在Alerts
中创建了mainviewcontroller
类的对象。
Alerts
类不会包含mainviewcontroller
的任何视图层次结构。
为此,您必须使用mainviewcontroller
或Alerts
将property
传递给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];
}