Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c ViewController实现UITextFieldDelegate时出错_Objective C_Ios_Cocoa Touch_Uiviewcontroller_Uitextfielddelegate - Fatal编程技术网

Objective c ViewController实现UITextFieldDelegate时出错

Objective c ViewController实现UITextFieldDelegate时出错,objective-c,ios,cocoa-touch,uiviewcontroller,uitextfielddelegate,Objective C,Ios,Cocoa Touch,Uiviewcontroller,Uitextfielddelegate,在我的ViewController类中实现UITextFieldDelegate时,在文本字段中输入第一个字符时引发以下错误: -[MyViewController respondsToSelector:]:消息已发送到解除分配的实例… 因此,我尝试创建一个单独的类(仅继承NSObject)并实现UITextFieldDelegate。猜猜看,它工作得很好。然而,这也带来了一些其他的问题,因为我不得不做很多我想避免的丑陋的跨类交流。以下是我的应用程序代理代码的相关部分: @interface R

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

-[MyViewController respondsToSelector:]:消息已发送到解除分配的实例…

因此,我尝试创建一个单独的类(仅继承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
@接口RMSAppDelegate:NSObject
@属性(非原子,保留)UIViewController*myViewController;
@结束
@实现MyAppDelegate
@综合视图控制器;
-(BOOL)应用程序:(UIApplication*)应用程序
didFinishLaunchingWithOptions:(NSDictionary*)启动选项{
myViewController=[[myViewController alloc]
initWithNibName:@“MyView”捆绑包:nil];
[self.window setRootViewController:myViewController];
[self.window makeKeyAndVisible];
返回YES;
}
@结束
。。下面是展示的内容:

@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
@接口MyViewController:UIViewController
@属性(非原子,保留)IBOutlet UITextField*pinTextField;
-(void)视图加载;
@结束
@MyViewController的实现
@合成pinTextField;
-(无效)viewDidLoad{
//不起作用(为什么?)
//[pinTextField setDelegate:self];
//行,但我想避免
[pinTextField setDelegate:[[[MyTextFieldDelegate alloc]初始化]自动释放];
[pinTextField成为第一响应者];
[超级视图下载];
}
@结束

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

因为您要求离题代码评论:您忘了调用
[super viewDidLoad]
。您也不需要重新声明原型以覆盖它。而且
@synthesis textFieldDelegate
无效,因为您在名为
textFieldDelegate
的类中没有属性。而且您的
dealoc
方法正在释放名为
tfd
的ivar,而该ivar在cla中似乎并不存在党卫军

您真正的问题是,无论在什么位置分配视图控制器,您都没有正确地保留它。可能是视图控制器正在nib中实例化并与ivar关联,而不是与声明的属性
retain
,或者与任何内容都没有关联。也可能是您正在中分配它代码,将其视图添加为某个对象的子视图,然后在不保留视图控制器本身的情况下释放它。或者可能只是在不应该释放它的时候才释放它


您的另一个类特别有效,因为您正在泄漏对象,因此它永远不会被释放。如果使用此方法,更好的解决方案是在分配对象时将其存储在ivar中,然后将其释放(并将ivar设置为nil)在
dealloc
viewDidUnload
中,我终于自己解决了这个问题。我没有更改代码。我的NIB(.xib)是罪魁祸首

我认为嵌套的UIViewController还可以,但我仍然认为在某些情况下是可以的(可能使用另一种编程方法)。无论如何,我用一个NIB初始化我的类
MyViewController
,在“对象”面板中,第一个对象是UIViewController

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


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

较新版本的编译器将使用
@synthetic
生成您的实例变量:
@synthetic foo=\u foo;
将创建带有下划线名称的ivar(风格上建议,以免新的程序员混淆他们正在访问的内容)同意,您将MyViewController的实例保留在您提供的代码范围之外。我已更新了我的代码,并将UIVC的init添加到我的问题中。请查看。
@synthesis
不需要多余的ivar声明,因为
bshirley
状态这只是一点点帮助。当然,它是有用的“可能是我在发布一些不应该发布的东西"…但这不总是向对象上的解除分配实例发送
消息的原因吗?无论如何,我现在发布了更多的代码,请看:)@Simeon:你会惊讶地发现,这正是人们需要告知的频率。你更新的代码工作正常。很明显,你正在尝试减少代码以显示错误,但en如果这样做,您需要确保缩减后的代码仍然显示错误。@albertamg:谢谢,我已将代码修改为示例,并遗漏了一些内容。删除了
dealoc
方法以缩短代码并专注于问题