初始化后如何为 UITextField 分配委托?

Posted

技术标签:

【中文标题】初始化后如何为 UITextField 分配委托?【英文标题】:How to assign a delegate for UITextField after initialization? 【发布时间】:2013-09-10 04:53:49 【问题描述】:

xcode 新手,当使用拖放在 XIB 中创建 UI 组件时,XCode 在哪里为这些组件声明和分配代码?

//where the heck are you?
UITextField* textField = [[UITextField alloc] initWithFrame: myFrame];

我检查了 XIB,但它只是 XML;检查了所有其他源文件,找不到它,所以我一定遗漏了什么。

我问是因为我需要在分配文本字段后向我的UITextField 添加一个代表。我尝试在initWithNibName 中执行此操作,但没有成功:

textField.delegate = self;

【问题讨论】:

首先 - 这真的是一个很好的问题。我已经为 ios 开发超过 1.5 年了,但从来没有想过如果你在 xib 中连接组件,组件分配在哪里;) 其次,你的组件是在你的主视图之后分配的。所以在 viewDidLoad 中设置 myTextField.delegate = self; 而不是 initWithNibName 因为那时你的主视图没有分配。 我希望每当您的 viewcontroller 实例在这些 xib 组件可能被初始化时被分配,我想我不确定。 【参考方案1】:

我也面临同样的问题。如果我将此行放在 ViewDidLoad 方法中,它对我来说很好。试试这样..

myTextField.delegate = self;

【讨论】:

【参考方案2】:

如果你为那个元素创建一个 IBOutlet 会不会起作用?然后将委托分配给它?

【讨论】:

我有一个用于文本字段的 IBOutlet;作为测试,我在一个动作方法中分配了委托,它有效,但它是一个 hack。我认为ViewDidLoad 会起作用。【参考方案3】:

对象加载过程:

当您使用 NSNib 或 NSBundle 的方法加载和实例化 nib 文件中的对象时,底层 nib 加载代码会执行以下操作:

它将 nib 文件的内容和任何引用的资源文件加载到内存中:

==>整个 nib 对象图的原始数据已加载到内存中,但并未取消存档。

==>任何与 nib 文件关联的自定义图像资源都会被加载并添加到 Cocoa 图像缓存中;请参阅“关于图像和声音资源”。

==>任何与 nib 文件关联的自定义声音资源都会被加载并添加到 Cocoa 声音缓存中;请参阅“关于图像和声音资源”。

它取消归档 nib 对象图数据并实例化对象。它如何初始化每个新对象取决于对象的类型以及它在存档中的编码方式。 nib 加载代码使用以下规则(按顺序)来确定使用哪种初始化方法。

==>默认情况下,对象会收到initWithCoder: 消息。 在 OS X 中,标准对象列表包括视图、单元格、菜单和视图控制器,它们由系统提供并在默认 Xcode 库中可用。它还包括使用自定义插件添加到库中的任何第三方对象。即使您更改了此类对象的类,Xcode 也会将标准对象编码到 nib 文件中,然后在对象取消归档时告诉归档器交换您的自定义类。

在 iOS 中,任何符合NSCoding 协议的对象都使用initWithCoder: 方法进行初始化。这包括 UIView 和 UIViewController 的所有子类,无论它们是默认 Xcode 库的一部分还是您定义的自定义类。

==>OS X 中的自定义视图会收到initWithFrame: 消息。 自定义视图是 NSView 的子类,Xcode 没有可用的实现。通常,这些是您在应用程序中定义并用于提供自定义视觉内容的视图。自定义视图不包括标准系统视图(如 NSSlider),它们是默认库的一部分或集成的第三方插件的一部分。

当遇到自定义视图时,Xcode 会将一个特殊的 NSCustomView 对象编码到您的 nib 文件中。自定义视图对象包含构建您指定的真实视图子类所需的信息。 在加载时,NSCustomView 对象向真实视图类发送一个 alloc 和 initWithFrame: 消息,然后将生成的视图对象交换为自身。最终效果是真实视图对象处理后续交互在笔尖加载过程中。

iOS 中的自定义视图不使用initWithFrame: 方法进行初始化。

==>上述步骤中未描述的自定义对象会收到初始化消息。

详细解释可以阅读苹果文档:at here..

【讨论】:

【参考方案4】:

您可以导入 UIKit 框架 #import <UIKit/UIKit.h>。在 UIKit 中,所有的 UIElements 都被定义了。检查这个Apple documentation

【讨论】:

不确定我是否遵循,这些只是头文件,我正在寻找我添加到我的 XIB 的组件在哪里声明和分配以在我的项目中使用。【参考方案5】:

为此,您需要在 ur 中包含基本的框架工作,例如 #import。 h 文件 例如,如果您使用的是文本字段,那么 你需要在你的 . h文件如下

@property (nonatomic, retain) IBOutlet UITextField *txtNote;

对于文本字段,您也需要添加其委托方法。

通过使用它,您可以在完成后映射文本视图

在你的 .m 文件中你需要声明@synthesize txtNote;在@implementation 下方

一旦完成,就无需分配任何东西,但请确保释放

menory 一旦你离开页面使用 dealloc 中的 [txtNote release] - (void)dealloc 方法

【讨论】:

基本上你需要将.h文件中的属性添加到你在Xib中使用的每个元素并释放内存

以上是关于初始化后如何为 UITextField 分配委托?的主要内容,如果未能解决你的问题,请参考以下文章

GMS 11.0.0 后如何为 TurnBaseMatches 选择对手?

声明后如何为 unique_ptr 赋值?

服务器身份验证后如何为前端提供 JSON Web 令牌?

在Postgres中加入两个表后如何为具有相同名称的列提供别名

成为FirstResponder 和多个 UITextField 焦点

在 CentOS 上升级到 python 2.7 后如何为 2.7 版本安装 python-devel