Я знаю ARC в iOS 5, но сейчас я разрабатываю стиль кода, предшествующий iOS 5, и хочу решить эту проблему с помощью подхода ручного выпуска.
Моя единственная цель для этого - сделатьочень удобный настраиваемый вид предупреждений с UITextField.
У меня есть представление BigView, в котором много функций.И он может генерировать много UIAlertView для многих различных ситуаций на дисплее с этим видом.Так что я знаю способ использования UIAlertViewDelegate для каждого представления оповещения, но экспериментально пытаюсь сделать это как «addTarget» UIButton (на самом деле это метод UIControl).
Вкратце,
Этов части класса BigView и моего экземпляра TextAlert, запущенного кнопкой для сбора электронной почты.
BigView.m
- (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
Так что моя главная проблема - это точка освобождения экземпляра TextAlert в «BigView», поскольку вы можете видеть толькочасть комментария полные коды выше.Конечно, если я удалю этот комментарий, у меня произойдет сбой при вызове метода deallocated.
И я также получу ошибку, сделав экземпляр textAlert автоматически выпущенным.
Для меня единственное решение дляэто делается для того, чтобы объект textAlert в BigView был членом BigView, а не локальным объектом.Но в этом случае моя первоначальная цель для удобного и легкого подхода для этого, я думаю, не будет достигнута.И у «BigView» уже много экземпляров участников, поэтому я не хочу больше добавлять.
Так что, есть предложения?Или будет приветствоваться любой комментарий для этой попытки.Я действительно готов услышать любые упреки в мой недостаточный код, правда.
Заранее спасибо,
MK