UIView 子类不可见
Posted
技术标签:
【中文标题】UIView 子类不可见【英文标题】:UIView subclass is not visible 【发布时间】:2012-06-12 06:05:59 【问题描述】:我正在创建一个 UIView (MultiColumnTableView) 的子类,它将包含几个表视图。但是,当我将自定义视图作为子视图添加到视图控制器时,它永远不可见,我真的不知道为什么?
我在我的根视图控制器中使用此代码添加它:
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
_multiColumnTableView = [[MultiColumnTableView alloc] initWithNumberOfColums:3 columnWidth:200 frame:CGRectMake(100, 100, 0, 400)];
_multiColumnTableView.dataSource = self;
_multiColumnTableView.delegate = self;
[self.view addSubview:_multiColumnTableView];
[_multiColumnTableView reloadData];
自定义类初始化器包含以下代码:
- (id)initWithNumberOfColums:(NSInteger)columns columnWidth:(float)width frame:(CGRect)frame
self = [super initWithFrame:frame];
if (self)
self.numberOfColumns = columns;
self.columnWidth = columnWidth;
self.bounds = CGRectMake(0, 0, columnWidth * numberOfColumns, self.bounds.size.height);
_tableViews = [NSMutableArray new];
// Create all the desired colums (= tableViews)
for (int i = 0; i < numberOfColumns; i++)
UITableView *t = [[UITableView alloc] initWithFrame:CGRectMake(columnWidth * i, 0, columnWidth, self.bounds.size.height)];
[_tableViews addObject:t];
t.tag = i;
t.backgroundColor = [UIColor blueColor];
t.dataSource = self;
t.delegate = self;
[self addSubview:t];
return self;
我希望看到一些蓝色的表格视图,但它们不可见,因此它们从不调用 cellForRowAtIndexPath:,但它们确实调用 numberOfRowsInSection。我的自定义子视图被添加到根视图。计算子视图时,它返回 1。任何人都可以看到问题吗?
【问题讨论】:
对于视图中的每个tableview,是否应该调用“reloadData”? 是的,确实如此。我的班级中有一个自定义的 reloadData 循环遍历所有这些数据。 你确定你的循环真的被击中了吗?我建议记录每个UITableView
的框架,看看它是否符合您的预期。
是的,我到处都有断点。所有的 tableViews 都在构造函数中创建,并且为每个 tableView 调用 reloadData。一切都按预期运行,除了 cellForRowAtIndexPath:,我认为这是因为它们不可见......
t.dataSource = self; t.delegate = 自我;在这里,您将它们设置为您的自定义视图,但它应该正式转到控制器支持的 UITableViewDelegate ..
【参考方案1】:
检查表格视图的每一帧是否正确分配。
【讨论】:
感谢您的快速回复。我已将原始问题中的高度更改为 400。不幸的是,无论我使用的是哪个高度,问题都仍然存在:( 然后检查每一帧tableviews是否正确分配。 我想你可能在这里有所收获。每个表视图的框架为 (0.000000, 0.000000, 0.000000, 400.000000)。我会进一步调查。 是的,您帮助 med 找到了问题!谢谢!问题是我将参数“宽度”带入构造函数,但它被 UIView 的标准宽度覆盖。如果您更改答案,我会将其标记为已接受,因为您帮助我找到了它:)【参考方案2】:在构造函数中进行以下更改。
- (id)initWithNumberOfColums:(NSInteger)columns columnWidth:(float)width frame:(CGRect)frame
self = [super initWithFrame:CGRectMake(frame.origin.x, frame.origin.y, columns*width, frame.size.height)];
if (self)
self.numberOfColumns = columns;
self.columnWidth = columnWidth;
_tableViews = [NSMutableArray new];
// Create all the desired colums (= tableViews)
for (int i = 0; i < numberOfColumns; i++)
UITableView *t = [[UITableView alloc] initWithFrame:CGRectMake(columnWidth * i, 0, columnWidth, frame.size.height)];
[_tableViews addObject:t];
t.tag = i;
t.backgroundColor = [UIColor blueColor];
t.dataSource = self;
t.delegate = self;
[self addSubview:t];
return self;
【讨论】:
我试过了,但没有任何区别......请详细说明这样做有什么区别? 您应该设置框架或边界。我删除了任何使用的界限。您是否复制了整个函数并将其粘贴到您的项目中? 是的。我同意您的方式是一种更好的方式,并且我已将其更改为您的代码。不过我不认为这是问题所在。以上是关于UIView 子类不可见的主要内容,如果未能解决你的问题,请参考以下文章
子类 UIView 不显示添加到它的 UIImageViews
将 UIView 添加到 TableViewfooter 不完全可见