Немного сложная проблема с выпуском для моего пользовательского представления предупреждений, имеющего UITextField - PullRequest
0 голосов
/ 20 марта 2012

Я знаю 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

Ответы [ 2 ]

1 голос
/ 20 марта 2012

Если все работает, кроме вашей проблемы с выпуском, вам следует рассмотреть только реализацию публичного метода "show" и частного метода "dismiss" (в вашем настраиваемом представлении предупреждений). В методе show вы должны вызывать [self retain] рядом с другими вещами иуволить (добавить эту цель к кнопке или что-то еще, что отклоняет ваш взгляд) вызвать [self release].

0 голосов
/ 20 марта 2012

Это не совсем то, о чем вы просили, но в любом случае может помочь вам.

Обработка нескольких UIAlertViews в одном UIViewController может быть болезненной.Когда я столкнулся с этой проблемой, я нашел альтернативный элемент управления на github, который называется BlockAlertsAndActionSheets .Он использует блоки вместо делегатов, внешний вид может быть полностью настроен (даже в стиле Apple по умолчанию), а также имеется «AlertView with UITextField».Работает хорошо для меня, и мне не пришлось изобретать это колесо!; -)

...