UITableViewCell из пользовательского файла .XIB не создает выходы - PullRequest
3 голосов
/ 29 марта 2012

Обновление 2:


Короче говоря, я был глупым (и, в свою защиту, необразованным) по этому поводу.Это работает сейчас.Мои вопросы немного отклонились от первоначальной темы, но это потому, что я не понимал, что происходит в моей заявке.Я хотел бы закрыть вопрос одним последним (и небольшим) запросом:

У меня есть две метки в моем customCell.xib.Я хочу, чтобы один из них (cell.label2) иногда содержал более длинный сегмент текста (2-3 строки).Я знаю, что один из способов сделать все это уместным - установить свойство autoshrink, но оно сжимается до текста, чтобы он мог уместиться на одной строке.Я хочу сохранить исходный размер текста и вместо этого увеличить высоту ячейки, чтобы текст занимал несколько строк, а не уменьшал ее.

Есть ли способ сделать это?

Обновление 1:


Я попробовал несколько вещей, основываясь на ответах ниже, и они ни к чему не привели.Я все больше убежден, что я делаю что-то в корне неправильно, и вы, ребята, просто не можете думать об этом, потому что это так просто.Итак, давайте попробуем еще раз.Я собираюсь немного изменить имена, чтобы их было легче запомнить.

Проблема, похоже, заключается в том, что я не могу создать IBOutlets или IBActions для своей customCell.Прямо сейчас у меня есть 3 файла, которые должны обработать это (DetailDirectionViewCell. {H, m, xib}, но Интерфейсный Разработчик не позволяет мне создавать свойство / выход / ссылку из моего UITableViewCell объекта - где угодно.

Вместо того, чтобы копировать код здесь, я предоставил запись PasteBin со ссылками на мой код. Как и раньше, я удалил менее интересные методы. Посмотрите, если хотите. http://pastebin.com/p4eADhKQ

У меня также есть customCell. {H, m}, но это просто новые файлы классов Objective C, которые наследуются от UITableViewCell. customCell.xib - это просто ячейка с двумя метками.


ИтакУ меня действительно есть пара проблем.

Во-первых, генерация UITableView программно с использованием пользовательского UITableViewCell, содержащегося в собственном файле .XIB. Мой класс DirectionsViewController - просто UITableView с программнымПри прикосновении к одной из ячеек необходимо представить таблицу DetailDirectionsViewController (модально), дизайн ячейки которой находится в файле DetailDirectionsViewCell.xib. Проблема в том, что я не могу создатьIBOutlet для UITableViewCell из файла пера - где угодно.Перетаскивание значка / выхода владельца файла не позволяет ничего создавать.Что после 5 часов борьбы означает, что я не могу представить свой подробный вид.

Вторая проблема заключается в добавлении панели навигации к DirectionsViewController, но давайте пока оставим это в покое.

Вот некоторые методы, которые могут оказаться полезными:

//inside DirectionsViewController
- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)
{
    DetailedDirectionsViewController *vc = [[DetailedDirectionsViewController alloc] initWithStyle:UITableViewStyleGrouped];
    vc.instruction = [turnList objectAtIndexPath:indexPath.row];
    [self.tabBarController presentModalViewController:vc animated:YES];
}

//inside DetailedDirectionsViewController
- (UITableViewCell *) tableView:(UITableView *) cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"directionsCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        [[NSBundle mainBundle] initWIthNibNamed:@"DetailedDirectionsViewCell" owner:nil options:nil];
        cell = self.tableViewCell;
        self.tableViewCell = nil;
    }

    //here I configure the custom cell
    return cell;
}

Я не думаю, что остальные методы представляют интерес, потому что они либо работают как положено, либо в значительной степени используются по умолчанию.

Подводя итог:

DirectionsViewController - по сути UITableViewController с пользовательскими ячейками.Файл .xib отсутствует. DetailDirectionsViewController - подробная информация о записях из DirectionsViewController.Ячейки здесь должны исходить из файла .XIB, но он не работает.DetailDirectionsViewCell - это пользовательская ячейка.Я не могу установить владельца этого файла.


Ответы [ 4 ]

11 голосов
/ 29 марта 2012

ОК. Вы не создаете IBOutlet соединение с владельцем файла. Посмотрите на скриншот. Вы создаете IBOutlet из представления CustomCell (с красной стрелкой).

Заботясь о своем коде, просто следуйте этим шагам.

1) Перейти к CustomCell.h файлу. Как вы говорите, customCell.xib имеет два UILabel с (предположим, label1 & label2), вам нужно будет объявить свойства и создать точки в файле CustomCell.h, а в файле .m синтезировать и выпустить его. См. Этот код моего экрана.

enter image description here

2) Теперь в CustomCell.xib, выберите представление CustomCell, а не владельца файла (владелец файла должен наследовать только от NSObject) перейдите в Identity Inspector (помеченный красным эллипсом) и выберите соответствующий класс Customcell (отмечен красным прямоугольником).

3) Щелкните правой кнопкой мыши по представлению своей пользовательской ячейки и установите соединение с ярлыками. И сохрани это ..

enter image description here

4) В вашем DirectionsViewController.m есть метод делегата этого UITableView cellForRowAtIndexPath. Измените это так:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
 static NSString *CustomCellIdentifier = @"CustomCell";
EditProjectCustomCell *cell = (EditProjectCustomCell *)[tableView dequeueReusableCellWithIdentifier: CustomCellIdentifier]; // typecast to customcell

[cell setSelectionStyle:UITableViewCellSelectionStyleBlue];

if (cell == nil)
{ 
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"EditProjectCustomCell" owner:self options:nil];

        for (id oneObject in nib) 
            if ([oneObject isKindOfClass:[EditProjectCustomCell class]])

            cell = (EditProjectCustomCell *)oneObject;

        [cell setSelectionStyle:UITableViewCellSelectionStyleBlue];

}

cell.label1.text=[someArray1 ObjectAtIndexPath: indexPath.row];
cell.label2.text=[someArray2 ObjectAtIndexPath: indexPath.row];

return cell;

}

этот метод делегата будет вызываться столько раз, сколько вы вернули в numberOfRowsInSection методе DataSource. Каждый раз, когда cell.label будет пустым, вы будете добавлять данные в метку, вызывая эту строку. поэтому нет необходимости каждый раз создавать метку, как вы делали здесь между строкой 79-90. http://pastebin.com/Vd4PKjTu

 cell.label1.text=[someArray ObjectAtIndexPath: indexPath.row];

Создание пользовательской ячейки означает, что вы сами создаете пользовательский интерфейс (например, .xib), интерфейс и реализацию (.h, .m файл) для UITableViewCell и применяете их в своем классе (например, DirectionsViewController.m) cellForRowAtIndexPath метод делегата. .

2 голосов
/ 29 марта 2012

Чтобы загрузить пользовательскую ячейку, я использовал этот код (протестируйте и он работает)

static NSString *CustomCellIdentifier = @"CustomCommentIdentifier";
detailedDirectionsViewCell *cell = (DetailedDirectionsViewCell *)[tableView dequeueReusableCellWithIdentifier:CustomCellIdentifier];
if (cell == nil) {
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"DetailedDirectionsViewCell" owner:self options:nil];
    for (id oneObject in nib)
        {
             if ([oneObject isKindOfClass:[DetailedDirectionsViewCell class]])
             {
                  cell = (DetailedDirectionsViewCell *)oneObject;
             }
        }
}

и убедитесь, что вы изменили файл пера класса ячейки следующим образом:

  1. Нажмите на владельца файла, измените его тип на NSObject (чтобы не путать при подключении к розеткам.
  2. Удалите все представления, которые есть в файле пера, затем перетащитеи удалите компонент UITableViewCell.
  3. Измените суперкласс компонента на класс Cell, в вашем случае измените ячейку с UITableViewCell на DetailedDirectionsViewCell.
  4. Подключитерозетка.

Это должно сработать, дайте мне знать, если у вас есть какие-либо вопросы.

0 голосов
/ 25 июля 2014

В моем случае у меня было два разных представления для одного класса ячеек.И когда я подключил розетки к файлу .h, они были связаны только с первым представлением представления, а не со вторым.Таким образом, чтобы убедиться, что ваши розетки действительно подключены, откройте меню Xcode me и откройте «Вид» -> «Утилиты» -> «Показать инспектор FileConnection», а затем убедитесь, что розетки вашего представления действительно связаны.

0 голосов
/ 13 сентября 2012

Чтобы ответить на ваш последний вопрос в Обновлении 2, рассматривали ли вы использование текстового поля вместо метки?Вы должны иметь возможность отключить редактирование, чтобы пользователь не мог изменить то, что отображается.Если вам нужно, чтобы он был меткой, в Инспекторе атрибутов для метки есть свойство «Линии» под выпадающим списком «Метка», которое вы можете настроить.Я не уверен, как получить доступ к этому свойству программно, но быстрый поиск в Google должен помочь вам там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...