Я пытаюсь добавить настраиваемый делегат в свой собственный UITableViewCell.
В этой ячейке у меня есть кнопка, которой нужно запустить метод в ViewController, где находится UITableView.
Я делаю все обычные шаги, чтобы добавить настраиваемого делегата, но по какой-то причине, когда я открываю VC во время выполнения, приложение вылетает и выдает ошибку неправильного доступа.
Когда я комментирую весь код делегата, он работает правильно, поэтому я предполагаю, что что-то не так, как я добавляю свой делегат. Когда я оставляю свое свойство id без комментариев, кажется, что происходит сбой.
Реализую протокол в ВК. Я назначил делегата ячейке в файле cellForRowAtIndexPath:. Все методы делегата на месте. Я использовал подобные конструкции в других классах, но никогда раньше не использовал их в подклассе UITableViewCells.
Прежде чем я опубликую код, я хотел бы знать, сталкивался ли кто-нибудь с этой ошибкой раньше. Если и как он это решил, или возможно ли вообще создать собственный делегат для подкласса UITableViewCell.
РЕДАКТИРОВАТЬ:
Мой customCell.h
#import <UIKit/UIKit.h>
@class MyTableViewCell;
@protocol MyTableCellProtocoll <NSObject>
-(void) didPressButton:(MyTableViewCell *)theCell;
@end
@interface MyTableViewCell : UITableViewCell
{
UIButton *myButton;
id<MyTableCellProtocoll> delegationListener;
}
@property (nonatomic,retain) UIButton *myButton;
@property (nonatomic,assign) id<MyTableCellProtocoll> delegationListener;
- (void) buttonAction;
@end
.m
#import "MyTableViewCell.h"
@implementation MyTableViewCell
@synthesize myButton;
@synthesize delegationListener;
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code
self.myButton = [UIButton buttonWithType:UIButtonTypeCustom];
self.myButton.backgroundColor = [UIColor clearColor];
self.myButton.frame = CGRectMake(5, 0, 10, 32);
self.myButton.titleLabel.adjustsFontSizeToFitWidth = YES;
[self.myButton addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];
[self.contentView addSubview:self.myButton];
}
return self;
}
- (void) buttonAction
{
NSLog(@"buttonpressed");
[self.delegationListener didPressButton:self];
}
@end
MyVC реализует делегат надлежащим образом в файле .h.
@interface MyVC : UIViewController <UITableViewDelegate, UITableViewDataSource, MyTableCellProtocoll>
и он также использует один метод делегата из MyTableCellProtocoll в .m
- (void)didPressButton:(MyTableViewCell *)theCell
{
NSLog(@"didPressButton");
}
Я назначаю делегата в cellForRowAtIndexPath:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[MyTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
cell.delegationListener = self;
}
return cell;
}
Это все местоположения, которые я использую для делегата. Я хочу, чтобы он изменил заголовок кнопки и вставил несколько строк после этой ячейки (измененные дубликаты)
Надеюсь, это немного прояснит ситуацию.
EDIT2: метод кнопки не вызывается при запуске, как было указано в разделе комментариев. Отредактированный код с логкодом.
EDIT3: с кнопкой все в порядке. Это свойство делегата, которое где-то перепуталось. С точками останова, журналами и комментариями я убедился в этом.
Код выполняется до последнего элемента в моем списке источников данных, после чего происходит сбой. На 1 шаг ближе к проблеме, я полагаю.
ОКОНЧАТЕЛЬНОЕ РЕДАКТИРОВАНИЕ: Хорошо, похоже, что все делегаты, кнопки и другие компоненты вообще не были проблемой. Это был heightForRowAtIndexPath: меня обманул. Спасибо за вашу поддержку в любом случае!
UITableViewCell
объектов. Здорово! - person Randika Vishman   schedule 06.07.2016