ИМХО, это плохой дизайн. Для начала, ваша ячейка не должна нуждаться в ссылке на контроллер представления, в котором находится таблица, в которой она находится (прочитайте это дважды, это едва ли имеет смысл только потому, что сама идея этого сбивает с толку). У вас есть сильная ссылка на этот контроллер представления. Так что же происходит, когда ОС пытается освободить ваш контроллер представления? Он никогда не сможет этого сделать, потому что ячейка табличного представления является сильной ссылкой на нее, сохраняя количество сохраняемых данных равным 1. Та же ситуация сохраняется для ячейки. Вы рискуете столкнуться с циклом сохранения здесь. Как правило, взгляды детей должны иметь слабые ссылки на своих родителей.
Но это даже не настоящие отношения родителей и детей. Вместо этого я бы предложил такой подход, который происходит в вашем контроллере представления, который содержит представление таблицы:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// Assuming you set a reuse identifier "cellId" in the nib for your table view cell...
MyCell *cell = (MyCell *)[tableView dequeueReusableCellWithIdentifier:@"cellId"];
if (!cell) {
// If you didn't get a valid cell reference back, unload a cell from the nib
NSArray *nibArray = [[NSBundle mainBundle] loadNibNamed:@"MyCell" owner:nil options:nil];
for (id obj in nibArray) {
if ([obj isMemberOfClass:[MyCell class]]) {
// Assign cell to obj, and add a target action for the checkmark
cell = (MyCell *)obj;
[cell.checkMarkButton addTarget:self action:@selector(checkPressed:) forControlEvents:whateverEventYouWant];
break;
}
}
}
// Set the tag of the cell here, since we may get a different cell back from the reuse queue
cell.checkMarkButton.tag = indexPath.row;
return cell;
}
Теперь настройте метод нажатия кнопки галочки
- (void)checkPressed:(id)sender {
UIButton *checkmark = (UIButton *)sender;
// This will give you the row of the checked button
int checkedCellRow = checkmark.tag;
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:checkedCellRow inSection:0];
// Now you can grab a reference to that cell if you need to
MyCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
}
Таким образом, вы сохраняете все, что связано с контроллером, в вашем классе контроллера (то есть, как обрабатывать нажатие кнопки галочки), и вам не нужно иметь дело с этой глупостью обращения к контроллеру представления вашей ячейки. таблица.
РЕДАКТИРОВАТЬ: Полагаю, я также должен помочь ответить на ваши вопросы ... Прежде всего, если вы говорите, что в вашем методе refreshVisibleViewForCell вы получаете нулевое значение для self.myTableView, Вы уверены, что он правильно подключен в IB? Даже если он подключен, нажмите на маленький крестик, чтобы отсоединить его и подключите снова, чтобы быть уверенным. Также убедитесь, что вы @synthesized ваше свойство myTableView. Не видя больше кода, проблема с IB - мое лучшее предположение относительно того, почему вы получаете нулевое значение для tableView. Нулевое значение здесь приведет к нулевым indexPath и selectedCell, а также. Что касается вашего большого вопроса, вы можете получить доступ к свойствам объектов в вашем контроллере представления. Эти свойства, конечно, могут быть объектами. Так что в вашем примере, если у вас есть свойство тега на selectedCell, вы можете получить к нему доступ из любого места, где у вас есть действительная ссылка на selectedCell. Если selectedCell равен нулю, свойство будет равно нулю. @class лучше подходит для заголовочных файлов. Например, если вы хотите сделать свою пользовательскую ячейку свойством контроллера представления, вы можете сказать:
#import <UIKit/UIKit.h>
@class MyCell;
@interface RootViewController : UIViewController
@property (nonatomic, strong) MyCell *cell;
@end
Затем в вашем файле реализации вы фактически импортируете MyCell.h. Если вы объявите форвард @class, вам не нужно будет импортировать все подробности о классе MyCell в заголовочный файл. Заголовок не должен знать обо всех свойствах и методах MyCell, просто вы намереваетесь использовать его в файле реализации. Таким образом, вы @class в заголовке, #import в реализации.