2012-03-20 6 views
0

私はiOS 5のARCを知っていますが、今はiOS 5以前のコードスタイルを開発しています。UITextFieldを持っている私のカスタムアラートビューの少し複雑なリリースの問題

私の唯一の目標は、UITextFieldで非常に便利なカスタムアラートビューを作成することです。

私は多くの機能を持つ 'BigView'ビューを持っています。そして、それは、おそらく、そのビューでディスプレイ上の多くの異なる状況に対して多くのUIAlertViewを生成する可能性があります。だから私は各アラートビューのUIAlertViewDelegateを使用する方法を知っていますが、実験的にUIButtonの 'addTarget'(実際には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 

あなただけのコメント部分の完全なコードを見ることができるように、私の主な問題は、「BigView」でTextAlertインスタンスのリリースポイントです上記。もちろん、そのコメントを取り除くと、割り当て解除されたメソッドの呼び出しのためにクラッシュしました。

また、私はautoreleasedとしてtextAlertインスタンスを作成するエラーを取得します。

私の場合、唯一の解決策は、 'BigView'の 'textAlert'オブジェクトを 'BigView'のメンバーではなくローカルオブジェクトにすることです。しかし、その場合、このための便利で軽量なアプローチの私の最初の目標は満足できないと私は思う。また、 'BigView'にはすでにメンバーインスタンスが多数あるため、これ以上追加する必要はありません。

どのようなご提案ですか?または、この試みのためのコメントを歓迎します。私は が本当に私の不十分なコードに反論しているのを聞く準備ができています。すべてはあなたのリリースの問題を除いて動作する場合は、事前に

おかげで、

MK

+0

私はUIAlertViewから継承し、NSObjectから継承してはならないと思います。initWithTitleメソッドをオーバーライド/追加してください。 – CarlJ

+0

@meccan "UIAlertViewクラスはそのまま使用され、サブクラス化をサポートしていません。クラスはプライベートであり、変更する必要はありません。 http://developer.apple.com/library/ios/#documentation/uikit/reference/UIAlertView_Class/UIAlertView/UIAlertView.html – joerick

+0

@joerick thx、私の間違いのためにsry! – CarlJ

答えて

0

これはあなたが求めているものではありませんが、とにかくお手伝いできます。

複数のUIAlertViewsを単一のUIViewControllerで処理することは苦しいことがあります。私はこの問題に遭遇したとき、BlockAlertsAndActionSheetsと呼ばれるgithubの代替コントロールを見つけました。デリゲートの代わりにブロックを使用し、外見は完全に(デフォルトのアップルスタイルに)カスタマイズすることができます。また、「UITextFieldを持つAlertView」もあります。私のために良い作品と私​​はその車輪を再発明する必要はなかった!;-)

+0

OK、これはとても便利なコンポーネントです。私はあなたとUIAlertViewの便利な使い方のプロジェクトのコンセプトに同意します。あなたは私に非常に素晴らしいリンクを与え、それを感謝します。私はこれを使いたいのですが、BlockTextPromptAlertViewインスタンスの入力テキストをメンバー変数として使用せずにマスタービューにどのように渡すことができるのか分かりません。言い換えれば、BlockTextPromptAlertViewインスタンスをローカルとして使用すると、そのブロック領域のテキストをメイン領域にどのように取得できますか。私は通知のアプローチだけを推測することができますが、私はそれがよりスマートな方法だと思う。あらかじめありがとうございます。 – mongkoon

+0

ああ!私はBlockTextPromptAlertViewでUITextFieldとやり取りする方法を見つけました!ありがとう! – mongkoon

1

はあなただけ(あなたのカスタムアラートビュー)メソッドを「却下」公共「ショー」メソッドとプライベートの実装を検討すべきである。..でshowメソッドを呼び出すと、他のものの横にある[self retain]を呼び出すと、[self relese]と呼ぶべきです。

+0

ええ、私はあなたの意見を持っていますが、[アラートショー]の後に、アラートから入力されたテキストを取得する必要があります。つまり、テキスト入力イベントを取得するためにいくつかの場所を開いて、それを受け取るためにオブジェクトをグローバルに残す必要があるということです。はい、リリースの問題は私の主なものですが、2)グローバルアラートメンバーを使用しない3)アラートのメンバーとマスター(アラートを発するオブジェクト)とテキストやその他のオブジェクトとして通信する。ご意見ありがとうございました。 「ショー」と「却下」のコンセプトとして、私はそれを念頭に置いていきます。 – mongkoon

+0

テキスト送信部分を達成するには、かなりの方法があります。あなたは、プロトコルを作成し、あなたの警告ビューに代理人を送ることができます、あなたは "NSString **"を送信し、それにテキストフィールドの文字列のコピーを与えるか、テキストを送信したいオブジェクトへのいくつかのグローバルリンクを持っています..また、 UIViewをサブクラス化して独自のカスタムアラートビューを作成することをお勧めします。私はすでにそれを成功させましたが、それは別の話題です。 –

関連する問題