创建一个新的 iOS 控件

Posted

技术标签:

【中文标题】创建一个新的 iOS 控件【英文标题】:Create A New iOS Control 【发布时间】:2014-06-23 19:03:15 【问题描述】:

我正在尝试为 Xcode 创建一个新控件以实现到新的 ios 应用程序中。最终的想法是以图形方式显示足球队的形成。我意识到这都可以通过编程方式进行编码,但我想创建一个新控件来代表一个球员,然后相应地加载编队,因为我将来可能会将其他球员信息添加到该控件中。

我创建了一个 xib 视图文件,其中是用于显示其名称的标签。我尝试了以下方法,但标签的文本没有显示。我错过了什么明显的东西吗?

[我已包含正确的标题并已连接标签并将 xib 设置为新类]

xib 的头文件:

@interface playerObject : UIControl
@property (nonatomic, strong) NSString *playerNameLabel;
@end    

xib 的实现文件:

#import "playerObject.h"
@interface playerObject ()
@property (strong, nonatomic) IBOutlet UILabel *nameLabel;
@end

@implementation playerObject
- (void) setPlayerNameLabel:(NSString *)playerNameLabel

    self.nameLabel.text = playerNameLabel;

查看控制器实现文件:

- (void)viewDidLoad

    ...
    playerObject *newPlayer = [[playerObject alloc] initWithFrame:CGRectMake(10, 10, 100, 150)];

    [newPlayer setPlayerNameLabel:@"TEST"];
    [newPlayer setBackgroundColor:[UIColor redColor]];
    [self.view addSubview:newPlayer];


提前致谢!

【问题讨论】:

【参考方案1】:

您可能创建了一个包含标签的 xib 文件,但您似乎没有使用它。您正在创建 playerObject 类的新实例,而不是从 xib 文件中加载一个。请查看 UINib 类文档。

【讨论】:

【参考方案2】:

您正在实例化您的自定义视图,而不是从 .xib 文件中加载它。 为了使其工作,请按照下列步骤操作:

    让您的playerObject 继承自UIView 而不是UIControl。 打开您的.xib 文件。 在左侧窗格中选择根视图。 在右侧窗格中,切换到 Identity Inspector 选项卡。 在第一个文本字段“Class”中输入playerObject。 确保在 Interface Builder 中连接了所有 IBOutlets

    执行以下操作以从 .xib 文件加载您的自定义 UIView

    playerObject *newPlayer = (playerObject *)[[[NSBundle mainBundle] loadNibNamed:@"MyXibFilename" owner:nil options:nil] firstObject];
    newPlayer.playerNameLabel = @"Lionel Messi";
    

请注意:我强烈建议您开始为您的类使用“命名空间”(它只是一个两个字母的前缀),例如XXPlayerObject,XX 是您认为描述您的应用程序/模块的其他名称。所有其他相关的自定义类都应该“共享”这个命名空间。看看 Apple 对它的类做了什么。

希望对你有帮助!

【讨论】:

@dgee4 如果它解决了您的问题,请告诉我。谢谢。 仅供参考,上面的 ping 无法 ping 用户,因为他们尚未参与此帖子。

以上是关于创建一个新的 iOS 控件的主要内容,如果未能解决你的问题,请参考以下文章

为啥控件的类名不好?不能创建新的 GDI 句柄?

做一个高德地图的 iOS / Android .NET MAUI 控件系列 - 创建控件

iOS - 在 MVVM 中动态创建控件

iOS - Target-Action机制创建自己的UI控件需要了解的知识

iOS - 创建可以在 InterfaceBuilder 中实时预览的自定义控件

iOS开发之资讯类App常用分类控件的封装与实现(CollectionView+Swift3.0+)