Могу ли я использовать метод viewDidLoad
в UITableviewCell
?
Могу ли я использовать метод viewDidLoad в UITableviewCell?
Ответ 1
Нет, вы не записываете viewDidLoad в подклассу класса пользовательских ячеек UITableViewCell (это часть UIViewController). У вас есть метод под названием
-(void)layoutSubviews
{
[super layoutSubviews];
}
где вы можете определить кадры и все для пользовательских элементов управления ячейками. Refer ссылка Apple UITableviewCell
Обратите внимание, однако, что 'viewDidLoad' называется только один раз в течение всего жизненного цикла объекта; он скорее похож на инициализатор в общем программировании OO. Однако "layoutSubviews" будет вызываться много раз в каждой ячейке (в зависимости от таких проблем, как прокрутка и т.д.). Важно понимать, что для этого резонанса многие вещи, которые вы обычно делаете в viewDidLoad, вы не можете делать в layoutSubviews.
Обратите внимание, что viewDidLoad вызывается только один раз: layoutSubviews вызывается часто.
Это будет просто простая функция, если вы ее напишете.
Ответ 2
Лучше позвонить super.layoutSubviews()
. Синтаксис Swift:
override func layoutSubviews() {
super.layoutSubviews()
}
Ответ 3
Если вы пытаетесь инициализировать некоторые IBOutlets вашего UITableViewCell, вам может понадобиться вызов awakeFromNib():
override func awakeFromNib() {
super.awakeFromNib()
// Do your stuff
// myIBOutlet.text = "Hello"
}
Ответ 4
Функция UIKit viewDidLoad
является членом UIViewController, а UITableViewCell не наследует ее. Вы можете написать метод с именем viewDidLoad
, если хотите, но он не будет вызываться, как в подклассе UIViewController.
Ответ 5
ДА вы можете написать viewDidLoad
в UITableViewCell
, но viewDidLoad
не является методом делегирования UITableViewCell
, поэтому он не будет вызываться автоматически, поэтому вы должны называть его вручную [self viewDidLoad]
для выполнения кода.
Ответ 6
вы можете использовать initWithFrame для UITableViewCell или UICollectionViewCell или для любого подкласса UIView.
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialisation code here
}
return self;
}
Ответ 7
Я понимаю, что это старый поток, но шаблон, который я иногда использую (особенно, если у меня есть базовый класс для моих пользовательских ячеек):
-
Добавьте свойство BOOL, назовите его что-то вроде "cellAlreadyDidLoad". Я назвал это так, потому что BOOL по умолчанию будет НЕТ, поэтому мне не нужно беспокоиться об установке его в методе init.
-
Создайте метод cellDidLoad, названный так с намерением, чтобы он вроде как viewDidLoad, который все мы знаем и любим.
-
Отмените метод layoutSubviews и добавьте:
if (!self.cellAlreadyDidLoad) { [self cellDidLoad]; self.cellAlreadyDidLoad = YES; }
Теперь у вас есть метод cellDidLoad, который будет вызываться только один раз, зная, что элементы интерфейса (включая ваши IBOutlets) будут присутствовать. Очень похоже на viewDidLoad на контроллер вида.