在我的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如果你看到任何我可以做得更好的代码(甚至是离题的),请留下评论。
发布于 2011-06-27 00:59:14
好吧,我终于靠自己解决了这个问题。我没有更改代码。我的NIB (.xib)是罪魁祸首!
我认为嵌套的UIViewControllers是可以的,我仍然认为它们在某些情况下是可以的(也许使用另一种编程方法)。不管怎样,我是用一个NIB来初始化我的类MyViewController的,它在Objects面板中有一个UIViewController作为第一个对象。
我解决这个问题的方法是将UIView作为对象面板中的第一个对象,并将文件的所有者设置为UIViewController。
正确的代码,错误的NIB。谢谢你的帮助。
发布于 2011-06-26 04:01:37
由于您请求了离题的代码注释:您忘记了调用[super viewDidLoad]。你也不需要重新声明原型来覆盖它。并且该@synthesize textFieldDelegate无效,因为您在名为textFieldDelegate的类中没有属性。您的dealloc方法释放了一个名为tfd的ivar,它似乎并不实际存在于类中。
您真正的问题是您没有在分配视图控制器的任何点上正确地保留它。可能是视图控制器在nib中被实例化,并且与ivar关联,而不是与声明为retain的属性关联,或者不与任何东西关联。或者,您可以在代码中分配它,将它的视图添加为某物的子视图,然后释放它,而不保留视图控制器本身。也可能是你只是在不该发布的时候发布它。
你的另一个类之所以能工作,是因为你泄漏了这个对象,所以它永远不会被释放。如果你使用这种方法,更好的解决方案是在分配对象时将其存储在ivar中,然后在dealloc和viewDidUnload中释放它(并将ivar设置为nil)。
https://stackoverflow.com/questions/6479993
复制相似问题