2

私は IOS HelloWorld の例に取り組んでいますが、TextField のデリゲートの設定に関して質問があります。この例では、TextField から ViewController にコントロールをドラッグするのと同じくらい簡単でした。しかし、次のようにデリゲートとして機能するカスタム クラスを作成したいとします。

#import <Foundation/Foundation.h>
@interface SweetAssDelegate : NSObject <UITextFieldDelegate>
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField;
@end

#import "SweetAssDelegate.h"

@implementation SweetAssDelegate
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField
{
    NSLog(@"Calling Delegate");
    [theTextField resignFirstResponder];
    return YES;
}
@end

このクラスを TextField のデリゲートに設定するにはどうすればよいですか? 私が知る限り、GUI でこれを行う方法はありません。ウィンドウの読み込み後に委任を手動で設定しようとしましたが、成功しませんでした:

#import "ViewController.h"
#import "SweetAssDelegate.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *inputField;
@end

- (void)viewDidLoad
{
    [super viewDidLoad];

    SweetAssDelegate *foo = [[SweetAssDelegate alloc] init];
    [self.inputField setDelegate:foo];

    NSLog(@"Delegate: %@", self.inputField.delegate);
}

キーボードを起動すると、実際に何らかのメモリ例外が発生しますか? 何か案は?ありがとう。

副次的な質問として、常に viewDidLoad を使用して変数を初期化する必要があるのはどこですか? init が呼び出されていないことに気付きましたか???

4

2 に答える 2

2

デリゲート オブジェクトfooはスコープ外に出ることが許可され、 の最後に解放されviewDidLoad、キーボードが表示されるまでに存在しなくなります。それをView Controllerのivar(またはプロパティ)にするか、そうでなければfoo、の最後で範囲外にならないようにしてくださいviewDidLoad

したがって、次のようになります。

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *inputField;
@property (strong, nonatomic) SweetAssDelegate *foo;
@end

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.foo = [[SweetAssDelegate alloc] init];
    [self.inputField setDelegate:self.foo];

    NSLog(@"Delegate: %@", self.inputField.delegate);
}
于 2012-10-04T17:32:16.907 に答える
0

あなたのテキストフィールドデリゲートは、私が推測するテキストフィールドデリゲートになるように実装されている必要があります。

デリゲートはオブジェクト間の通信を管理します。つまり、カスタム デリゲートはオブジェクト間の通信を許可し、メソッドを提供する必要があります。

別の例は tableView です。

デリゲートを実装し、いくつかのテーブルビュー関連のメソッドを呼び出すカスタム デリゲートを作成できます...

ここで、このコードはあなたにとって興味深いかもしれません:

@interface myCustomDelegateForTextFields <UITextFieldDelegate>


@end

@implementation myCustomDelegateForTextFields 

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {

return TRUE;

}

@end

@implementation ViewController 


myCustomDelegateForTextFields *txtfielddelegate = [[myCustomDelegateForTextFields alloc] init];

UITextField *whatever;
whatever.delegate = txtfielddelegate;

//your textfield now listens to the BOOL method in your custom delegate

@end

それはあなたが探していたものですか?:)

myCustomDelegateForTextField デリゲートを別のクラスにパックして、そのクラスを呼び出すことができます

于 2012-10-04T17:44:48.180 に答える