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

UILabel 在圆形自定义 UIView 中不可见

将 UIView 添加到 TableViewfooter 不完全可见

子类化 UIView 或使用 UIView 组合

XIB 中的 UIView 子类不显示(drawRect:从未调用)

以 UIScrollView 作为子类的 UIView 不接收触摸事件