我知道iOS 5中的ARC,但我现在正在开发iOS 5之前的代码样式,并希望通过手动发布方法解决此问题。
我唯一的目标是使用UITextField创建一个非常方便的自定义警报视图。
我有一个“ BigView”视图,其中包含许多功能。它可能会针对具有该视图的显示器上的许多不同情况生成许多UIAlertView。因此,我知道对每个警报视图使用UIAlertViewDelegate的方式,但是通过实验尝试使它像UIButton的“ addTarget”(实际上是UIControl的方法)一样。
简而言之,
这是在“ BigView”类和通过电子邮件收集按钮触发的“ TextAlert”实例的一部分中。
大视图
- (void)emailFeedback:(id)sender
{
TextAlert *textAlert = [[TextAlert alloc] initWithTitle:@"Enter your email address"];
[textAlert setTarget:self action:@selector(textAlertInputed:)];
// [textAlert release];
}
- (void)textAlertInputed:(NSString *)text
{
NSLog(@"text alert inputed, text: %@", text);
}
这些都是我的TextAlert文件的全部内容。
TextAlert.h
#import <Foundation/Foundation.h>
@interface TextAlert : NSObject <UIAlertViewDelegate>
{
UIAlertView *alertView;
UITextField *textField;
id target;
SEL action;
}
- (id)initWithTitle:(NSString *)title;
- (void)setTarget:(id)target action:(SEL)action;
@end
TextAlert.m
#import "TextAlert.h"
@implementation TextAlert
- (id)initWithTitle:(NSString *)title
{
if (self = [super init])
{
alertView = [[UIAlertView alloc] initWithTitle:title message:@"beneath" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
textField = [[UITextField alloc] initWithFrame:CGRectMake(12, 45, 260, 25)];
CGAffineTransform myTransform = CGAffineTransformMakeTranslation(0, 60);
[alertView setTransform:myTransform];
[textField setBackgroundColor:[UIColor whiteColor]];
[alertView addSubview:textField];
[alertView show];
}
return self;
}
- (void)dealloc
{
[alertView release]; alertView = nil;
[textField release]; textField = nil;
[super dealloc];
}
- (void)setTarget:(id)_target action:(SEL)_action
{
target = _target;
action = _action;
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
[target performSelector:action withObject:textField.text];
}
@end
所以我的主要问题是“ BigView”中TextAlert实例的发布点,因为您可以看到上面唯一的注释部分完整代码。当然,如果我删除该注释,则会导致请求释放方法的崩溃。
而且我也得到错误使textAlert实例成为自动发布的实例。
对我而言,唯一的解决方案是使“ BigView”中的“ textAlert”对象成为“ BigView”的成员而不是本地对象。但是在那种情况下,我认为对于这种方便,轻便的方法的最初目标并不满意。而且“ BigView”已经有很多成员实例,因此我不想再添加任何成员实例。
有什么建议吗?或欢迎对此尝试发表任何评论。我准备听到任何声音
确实证明了我的代码不足。
提前致谢,
MK
最佳答案
这不是您直接要求的,但仍然可以为您提供帮助。
在单个UIAlertViews
中处理多个UIViewController
可能很痛苦。当我遇到这个问题时,我在github上找到了一个替代控件,称为BlockAlertsAndActionSheets。它使用块而不是委托,可以完全自定义外观(甚至使用默认的Apple样式),并且还具有“带有UITextField的AlertView”。对我来说很有效,我不必重新发明轮子! ;-)