Подкласс UIView не отображается

Я создаю подкласс 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. Может ли кто-нибудь увидеть проблему?


person Accatyyc    schedule 08.06.2012    source источник
comment
Должен ли он вызывать reloadData для каждого табличного представления внутри вашего представления?   -  person Tom    schedule 08.06.2012
comment
Да, и это так. У меня есть собственный reloadData в моем классе, который проходит через все из них.   -  person Accatyyc    schedule 08.06.2012
comment
Вы уверены, что ваш цикл действительно попал? Я бы посоветовал регистрировать фрейм каждого UITableView, чтобы увидеть, чего вы ожидаете.   -  person skram    schedule 08.06.2012
comment
Ага, у меня везде есть точки останова. Все tableViews создаются в конструкторе, и reloadData вызывается для каждого tableView. Все работает, как ожидалось, за исключением cellForRowAtIndexPath :, что, как я полагаю, связано с тем, что они не видны ...   -  person Accatyyc    schedule 08.06.2012
comment
t.dataSource = self; t.delegate = self; Здесь вы устанавливаете их в свой собственный вид, но он должен перейти в контроллер, поддерживающий UITableViewDelegate, официально ...   -  person Tom    schedule 08.06.2012
comment
Я знаю об этом. Пользовательский контроллер - это UITableViewDelegate, как и корневой контроллер представления.   -  person Accatyyc    schedule 08.06.2012
comment
Извините, я запутался, ваш собственный класс является подклассом UIView, и он содержит много UITableView (ов), обычно, если вы хотите отображать UITableView (ы), вы указываете его Контроллер ‹один или отдельно для каждого из них› в вашем code, self для каждой точки tableview, указывающей на настраиваемый класс, так как же он работает как контроллер?   -  person Tom    schedule 08.06.2012
comment
Хех, я понимаю путаницу. Это конвейер представления таблицы, он смотрит на класс, использующий его как единое представление таблицы, но разбивает все ячейки на несколько представлений таблицы (или столбцов). Таким образом, это табличное представление, его использование похоже на использование стандартного табличного представления, но под капотом оно выполняет гораздо больше работы.   -  person Accatyyc    schedule 08.06.2012
comment
В любом случае проблема решена! Умгре помог мне его найти. Это произошло потому, что аргумент ширины моего конструктора был переопределен стандартной шириной UIView. Предупреждений не получил и не думал об этом. Спасибо всем за помощь!   -  person Accatyyc    schedule 08.06.2012
comment
Спасибо. Я думаю, что понял то, что вы сказали, просто не знаю, правильно ли вы указали весь делегат или источник данных столбцов (представления таблиц) или нет. :)   -  person Tom    schedule 08.06.2012


Ответы (2)


проверьте правильность назначения каждого кадра tableviews.

person Umgre    schedule 08.06.2012
comment
Спасибо за быстрый ответ. Я изменил высоту в исходном вопросе на 400. К сожалению, проблема сохраняется независимо от высоты, которую я использую :( - person Accatyyc; 08.06.2012
comment
Затем проверьте, правильно ли назначен каждый кадр табличных представлений. - person Umgre; 08.06.2012
comment
Я думаю, вы здесь что-то заметили. Рамка каждого представления таблицы (0.000000, 0.000000, 0.000000, 400.000000). Я собираюсь изучить это подробнее. - person Accatyyc; 08.06.2012
comment
Ага, вы помогли меду найти проблему! Спасибо! Проблема заключалась в том, что я вводил ширину аргумента в конструктор, но она была переопределена стандартной шириной UIView. Если вы измените свой ответ, я помечу его как принятый, так как вы помогли мне его найти :) - person Accatyyc; 08.06.2012

сделать следующие изменения внутри конструктора.

- (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;
}
person Apurv    schedule 08.06.2012
comment
Я пробовал это, и это не имеет никакого значения ... Уточните, в чем разница, когда вы делаете это таким образом? - person Accatyyc; 08.06.2012
comment
Вы должны либо установить рамку, либо границы. Я удалил границы везде, где использовался. Вы скопировали всю функцию и вставили ее в свой проект? - person Apurv; 08.06.2012
comment
да. Я согласен с тем, что ваш способ - лучший способ сделать это, и я изменил его на ваш код. Я не думаю, что это была проблема. - person Accatyyc; 08.06.2012