如何在 xib 中访问 UITextLabel?
Posted
技术标签:
【中文标题】如何在 xib 中访问 UITextLabel?【英文标题】:How can I access the UITextLabel in a xib? 【发布时间】:2014-03-08 14:41:05 【问题描述】:我将自定义MyView
设置为UITableView
的背景视图:
MyView *noCellsView = [[MyView alloc] init];
[[noCellsView messageLabel] setText:@".........."];
[[self tableView] setBackgroundView:noCellsView];
显示为背景视图,但未设置messageLabel
。
这是为什么呢?
MyView.h
#import <UIKit/UIKit.h>
@interface MyView : UIView
@property (weak, nonatomic) IBOutlet NSObject *viewFromNib;
@property (weak, nonatomic) IBOutlet UILabel *messageLabel;
@end
MyView.m
#import "MyView.h"
@implementation MyView
- (id)initWithFrame:(CGRect)frame
self = [super initWithFrame:frame];
if (self)
UIView* xibView = [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil] objectAtIndex:0];
[xibView setFrame:[self bounds]];
[self addSubview:xibView];
return self;
@end
MyView.xib messageLabel 连接到@property。
【问题讨论】:
你做了一个init
,但是你覆盖了initWithFrame
@Larme 默认 UIView 的 -init 调用 -initWithFrame: with CGRectZero.
【参考方案1】:
也许您将您的插座连接到您笔尖中的MyView
视图,但没有连接到file owner
。这样你最终得到MyView
视图和另一个MyView
作为子视图。但是插座只为孩子MyView
设置。
- (id)initWithFrame:(CGRect)frame
...
// see that `owner:` parameter, it's the one who you want that `file owner` thing
// to be, so if you'll bind outlets to file owner in xib and pass self to
// this method for owner: parameter, you'll have outlets, binded to `file owner`
// assigned to self.
UIView* xibView = [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil] objectAtIndex:0]; // outlets are assigned to xibView, but not to self
...
[self addSubview:xibView];
...
要使其工作,您可以(在 Interface Builder 中)将 outlet 绑定到 file owner
而不是 MyView
视图。但是,那将是一团糟(你有MyView
和MyView
作为子视图,第一个是子视图的某种冗余代理),我建议你只创建一些其他方法或加载直接通过-loadNibNamed:owner:options:
查看。
// example method
+ (instancetype)loadFromXib
// make sure that for that case you leave outlets binded to `MyView`, not to `file owner`.
MyView *myView = ... //load from xib
return myView;
// ...
// later on:
MyView *noCellsView = [MyView loadFromXib]; // vs [[MyView alloc] init];
[[noCellsView messageLabel] setText:@".........."];
[[self tableView] setBackgroundView:noCellsView];
【讨论】:
感谢@Maniak_bobrii,我需要进行哪些更改才能使其正常工作? 好的答案总是受欢迎的以上是关于如何在 xib 中访问 UITextLabel?的主要内容,如果未能解决你的问题,请参考以下文章
如何在特定单词的垂直 UIStackView 换行符中制作 UITextLabel 文本 l
如何从 XIB 文件访问 ViewController 中的 IBoutlet
swift - 在UIScrollView上从xib添加UIView后如何更新约束?