首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ViewController实现UITextFieldDelegate时出错

ViewController实现UITextFieldDelegate时出错
EN

Stack Overflow用户
提问于 2011-06-26 03:22:36
回答 2查看 1.2K关注 0票数 0

在我的ViewController类中实现UITextFieldDelegate时,在文本字段中输入第一个字符时会抛出以下错误:

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

因此,我尝试创建一个单独的类(仅继承NSObject)并实现UITextFieldDelegate。猜猜发生了什么,它工作得很完美。然而,这引入了一些其他问题,因为我必须做很多丑陋的跨类通信,而我希望避免这些问题。下面是我的应用委托代码的相关部分:

代码语言:javascript
复制
@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

。。下面是正在显示的内容:

代码语言:javascript
复制
@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

如果你看到任何我可以做得更好的代码(甚至是离题的),请留下评论。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-27 00:59:14

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

我认为嵌套的UIViewControllers是可以的,我仍然认为它们在某些情况下是可以的(也许使用另一种编程方法)。不管怎样,我是用一个NIB来初始化我的类MyViewController的,它在Objects面板中有一个UIViewController作为第一个对象。

我解决这个问题的方法是将UIView作为对象面板中的第一个对象,并将文件的所有者设置为UIViewController。

正确的代码,错误的NIB。谢谢你的帮助。

票数 0
EN

Stack Overflow用户

发布于 2011-06-26 04:01:37

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

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

你的另一个类之所以能工作,是因为你泄漏了这个对象,所以它永远不会被释放。如果你使用这种方法,更好的解决方案是在分配对象时将其存储在ivar中,然后在deallocviewDidUnload中释放它(并将ivar设置为nil)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6479993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档