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

由于您要求提供偏离主题的代码注释:您忘记调用[super viewDidLoad]. 您也不需要重新声明原型来覆盖它。并且@synthesize textFieldDelegate无效,因为您在名为 的类中没有属性textFieldDelegate。并且您的dealloc方法正在释放一个名为的 ivar tfd,它似乎实际上并不存在于该类中。

您真正的问题是您在分配视图控制器的任何时候都没有正确保留它。可能是视图控制器在 nib 中被实例化并与 ivar 而不是声明的属性retain相关联,或者没有与任何东西相关联。或者可能是您在代码中分配它,将其视图添加为某事物的子视图,然后在不保留视图控制器本身的情况下释放它。或者它可能只是你在不应该的时候释放它。

您的其他类专门工作,因为您正在泄漏对象,因此它永远不会被释放。如果您使用这种方法,更好的解决方案是在分配对象时将其存储在 ivar 中,然后在两者中释放它(并将 ivar 设置为 nil)deallocviewDidUnload.

于 2011-06-25T20:01:36.897 回答
0

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

我认为嵌套的 UIViewControllers 是可以的,我仍然认为它们在某些情况下是可以的(并且可能使用另一种编程方法)。无论如何,我正在MyViewController使用一个 NIB 初始化我的类,该 NIB 在 Objects 面板中有一个 UIViewController 作为第一个对象。

我通过将 UIView 作为“对象”面板中的第一个对象并将文件的所有者设置为 UIViewController 来解决此问题。

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

于 2011-06-26T16:59:13.960 回答