ViewController实现UITextFieldDelegate时出错

在我的ViewController类中实现UITextFieldDelegate时,在文本字段中input第一个字符时会引发以下错误:

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

所以,我试着创build一个单独的类(只inheritanceNSObject)并实现UITextFieldDelegate。 猜猜看,它完美的工作。 然而,这引起了一些其他问题,因为我必须做很多丑陋的跨class级交stream,我想避免。 以下是我的应用程序委托代码的相关部分:

 @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 

如果你看到任何代码(甚至是主题),我可以做得更好,请发表评论。

由于您要求脱离主题的代码评论:您忘记调用[super viewDidLoad] 。 您也不需要重新声明原型以覆盖原型。 而@synthesize textFieldDelegate是无效的,因为在名为textFieldDelegate的类中没有属性。 而你的dealloc方法是释放一个名为tfd实际上并不存在的ivar。

你真正的问题是,你没有妥善保留视图控制器在你分配的任何点。 这可能是视图控制器正在一个笔尖实例化,并与一个伊娃相关联,而不是声明retain属性,或不与任何关联。 或者可能是您在代码中分配它,将其视图添加为某个子视图,然后释放它而不保留视图控制器本身。 或者它可能只是当你不应该释放它时。

你的其他类专门工作,因为你泄漏的对象,所以它永远不会被释放。 更好的解决方法是,如果你使用这个方法,当你分配它然后在deallocviewDidUnload释放它(并且设置ivar为零)时,将对象存储在ivar中。

好吧,我终于自己解决了这个问题。 我没有改变代码。 我的NIB(.xib)是罪魁祸首!

我认为嵌套UIViewControllers是好的,我仍然认为他们在某些情况下(也许使用另一种编程方法)。 无论如何,我正在初始化我的类MyViewController与对象面板中有一个UIViewController作为第一个对象的NIB。

我通过将UIView作为Objects面板中的第一个对象来解决这个问题,并将File's Owner设置为UIViewController。

正确的代码,不正确的NIB。 感谢您的帮助。