我知道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”。对我来说很有效,我不必重新发明轮子! ;-)

10-07 18:19