Вопрос по storyboard, iboutlet, uitableview, ios – Подключите розетку Cell Prototype в раскадровку

36

Я новичок в раскадровке, и поэтому у меня возникли некоторые трудности ...

Я создал TableViewController, и я хотел бы настроить прототип ячейки. В прототип ячейки я добавил несколько меток, которые я хотел бы настроить с помощью своего собственного класса, который наследуется от UITableViewCell (AreaListCell). В раскадровке для прототипа ячейки я настроил пользовательский класс с & quot; AreaListCell & quot; и его стиль - «Пользовательский».

В раскадровке, когда я выбираю Прототип ячейки, а затем помощника, помощник отображает мой класс, который реализует UITableViewController (AreasTableViewController), а не
мой & quot; AreaListCell & quot; учебный класс.

В результате я могу создать розетку (используя Ctrl + Drag из метки прототипа ячейки) для класса AreasTableViewController, но не для класса AreaListCell! Есть идеи, как подключить Cell Prototype к моему классу AreaListCell?

Спасибо за вашу помощь!

Ваш Ответ

3   ответа
128

UPDATE: As of Xcode 4.6 (possibly earlier) you can now create outlets by control-dragging! - This has to be done into an interface section or class extension (the class extension doesn't exist by default for new cell subclasses. Thanks to Steve Haley for pointing this out.

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

В интерфейсе подкласса вашей ячейки:

@interface CustomCell : UITableViewCell

@property (nonatomic) IBOutlet UILabel* customLabel;

@end

Синтезировать как обычно в реализации.

В раскадровке выберите ячейку и перейдите к инспектору соединений, вы увидите новую розетку. Перетащите оттуда к соответствующему элементу в вашем прототипе:

enter image description here

Теперь это можно получить какcell.customLabel в вашемcellForRowAtIndexPath: метод.

Раньше я делал это для своей ячейки, но вдруг она перестала работать, мой customLabel IBOutlet == nil, и он не появляется в ячейке. Что может быть причиной проблемы? В сториборде розетки подключены.
TLDR: создать розетку программно и подключить ее с помощью элемента управления + перетаскивание из раскадровки
0

Swift 3

// мы используем это, если ваши изображения на сервере.

// мы получаем изображения из URL.

// вы можете установить изображение из вашего Xcode.

  1. The URL of images are in an array name = thumbnail i.e self.thumbnail[indexPath.row]
  2. on UITableviewCell put a imageView on cell
  3. select UIimageView assign it a tag from storyboard.

    let pictureURL = URL(string: self.thumbnail[indexPath.row])!
    let pictureData = NSData(contentsOf: pictureURL as URL)
    let catPicture = UIImage(data: pictureData as! Data)
    var imageV = UIImageView()
    imageV = cell?.viewWithTag(1) as! UIImageView
    imageV.image = catPicture
    
21

Да, вы не можете соединить представления, которые находятся внутри пользовательской ячейки прототипа, используя метод ctrl + drag. Вместо этого используйте свойство tag представления, а затем, когда вы строите ячейку, вытащите метки, используя их теги.

Вот:

//Let's assume you have 3 labels.  One for a name, One for a count, One for a detail
//In your storyboard give the name label tag=1, count tag=2, and detail tag=3


- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomTableViewCell *theCell = [tableView dequeueReusableCellWithIdentifier:@"Prototype Cell"];

    UILabel *nameLabel = (UILabel *)[theCell viewWithTag:1];
    UILabel *countLabel = (UILabel *)[theCell viewWithTag:2];
    UILabel *detailLabel = (UILabel *)[theCell viewWithTag:3];

    nameLabel.text = @"name";
    countLabel.text = @"count";
    detailLabel.text = @"details";

    return theCell;
}

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

Мне потребовалось несколько дней, чтобы понять, что я не могу ctrl + перетащить из пользовательской ячейки для создания IBOutlet.

Удачи!

РЕДАКТИРОВАТЬ: вы можете создавать IBOutlets для ваших меток внутри пользовательской ячейки и создавать ссылки программно, но не с помощью метода ctrl + drag.

РЕДАКТИРОВАТЬ 2: Я был совершенно не прав, вы можете Ctrl + перетащить. Смотрите второй ответ на этот вопрос. Это сложно, но работает довольно хорошо.

Я не рекомендую использовать теги, так как вам нужно хранить их отдельно, что, как правило, более подвержено ошибкам.
Вы, конечно, можете подключить розетки из прототипа к подклассу ячейки, используемому в качестве прототипа. Я отвечу с деталями, как только смогу собрать пример.
Хорошо, вы не можете автоматически создавать розетки, перетаскивая их на помощника, но МОЖЕТЕ создавать розетки вручную и подключать их. Вам определенно не нужно использовать теги. Хотя было бы немного меньше голосов, если вы отредактируете ответ, я его удалю (я не могу изменить голосование, пока вы не отредактируете)
С Ctrl + перетащить?

Похожие вопросы