0

ViewController クラスに UITextFieldDelegate を実装すると、テキスト フィールドに最初の文字を入力すると、次のエラーがスローされます。

-[MyViewController respondsToSelector:]: message sent to deallocated instance...

ということで、別クラス(NSObjectのみ継承)を作ってUITextFieldDelegateを実装してみました。何を推測すると、それは完全に機能しました。ただし、回避したい多くの醜いクラス間コミュニケーションを行わなければならないため、他の問題がいくつか発生します。私のアプリデリゲートコードの関連部分は次のとおりです。

@interface RMSAppDelegate : NSObject <UIApplicationDelegate,
                                      UITabBarControllerDelegate>

@property (nonatomic, retain) UIViewController* myViewController;

@end

@implementation MyAppDelegate

@synthesize myViewController;

- (BOOL)application:(UIApplication *)application
            didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    myViewController = [[MyViewController alloc]
                         initWithNibName:@"MyView" bundle:nil];
    [self.window setRootViewController:myViewController];
    [self.window makeKeyAndVisible];
    return YES;
}

@end

..そして、ここに表示されているものがあります:

@interface MyViewController : UIViewController <UITextFieldDelegate>

@property (nonatomic, retain) IBOutlet UITextField* pinTextField;
- (void)viewDidLoad;

@end

@implementation MyViewController

@synthesize pinTextField;

- (void)viewDidLoad {
    // DOES NOT WORK (WHY?)
    //[pinTextField setDelegate:self];

    // WORKS, BUT I'D LIKE TO AVOID
    [pinTextField setDelegate:[[[MyTextFieldDelegate alloc] init] autorelease];

    [pinTextField becomeFirstResponder];
    [super viewDidLoad];
}

@end

そして、私がもっとうまくやれるコード (トピックから外れていても) を見つけたら、コメントを残してください。

4

2 に答える 2

0

さて、私はついにこれを自分で解決しました。コードは変更していません。私のNIB(.xib)が原因でした!

ネストされたUIViewControllersは問題ないと思いましたが、それでも場合によっては(そして、別のプログラムによる方法を使用して)問題があると思います。とにかく、MyViewControllerオブジェクトパネルの最初のオブジェクトとしてUIViewControllerを持つNIBを使用してクラスを初期化していました。

これを解決するには、オブジェクトパネルの最初のオブジェクトとしてUIViewを使用し、代わりにファイルの所有者をUIViewControllerに設定します。

正しいコード、間違ったNIB。ご協力ありがとうございました。

于 2011-06-26T16:59:13.960 に答える
0

トピック外のコードコメントを求めたので:あなたはを呼び出すのを忘れています[super viewDidLoad]。また、プロトタイプをオーバーライドするためにプロトタイプを再宣言する必要はありません。また、 。@synthesize textFieldDelegateという名前のクラスにプロパティがないため、は無効ですtextFieldDelegate。そして、あなたのメソッドは、クラスに実際には存在しないように見えるdeallocという名前のivarをリリースしています。tfd

あなたの本当の問題は、あなたがそれを割り当てたどの時点でもあなたがViewControllerを適切に保持していないということです。ビューコントローラがペン先でインスタンス化されており、宣言されたプロパティではなくivarretainに関連付けられているか、何にも関連付けられていない可能性があります。または、コードで割り当て、ビューを何かのサブビューとして追加し、ビューコントローラー自体を保持せずに解放している可能性があります。または、リリースすべきでないときにリリースしているだけかもしれません。

他のクラスは、オブジェクトをリークしているために特に機能するため、割り当てが解除されることはありません。より良い解決策は、このメソッドを使用する場合、オブジェクトを割り当てるときにオブジェクトをivarに格納してから、との両方でオブジェクトを解放する(そしてivarをnilに設定する)ことdeallocですviewDidUnload

于 2011-06-25T20:01:36.897 に答える