Методы являются функциями классов. В обычном жаргоне люди обмениваются методами и функционируют повсюду. По сути, вы можете думать о них как об одном и том же (не уверен, что глобальные функции называются методами).
На самом деле это довольно просто.
Просто создайте новый подкласс UIControl и поместите все это туда (нет необходимости в отдельном контроллере). Назовем его ToggleImageControl.
@interface ToggleImageControl : UIControl
{
BOOL selected;
UIImageView *imageView;
UIImage *normalImage;
UIImage *selectedImage;
}
Создайте ToggleImageControl для каждой ячейки и добавьте его в соответствующую позицию.
ToggleImageControl *toggleControl = [[ToggleImageControl alloc] initWithFrame: <frame>];
toggleControl.tag = indexPath.row; // for reference in notifications.
[cell.contentView addSubview: toggleControl];
Добавьте UIImageView, чтобы содержать изображение. Добавьте цель для события касания.
- (void) viewDidLoad
{
normalImage = [UIImage imageNamed: @"normal.png"];
selectedImage = [UIImage imageNamed: @"selected.png"];
imageView = [[UIImageView alloc] initWithImage: normalImage];
// set imageView frame
[self.view addSubview: imageView];
[self addTarget: self action: @selector(toggleImage) forControlEvents: UIControlEventTouchUpInside];
}
Установите свойство изображения UIImageView для обновления изображения; это вызовет перерисовку без побочных эффектов.
- (void) toggleImage
{
selected = !selected;
imageView.image = (selected ? selectedImage : normalImage);
// Use NSNotification or other method to notify data model about state change.
// Notification example:
NSDictionary *dict = [NSDictionary dictionaryWithObject: [NSNumber numberWithInt: self.tag forKey: @"CellCheckToggled"];
[[NSNotificationCenter defaultCenter] postNotificationName: @"CellCheckToggled" object: self userInfo: dict];
}
Очевидно, вам нужно помассировать некоторые вещи. Вероятно, вы захотите передать два имени изображения, чтобы сделать его более пригодным для повторного использования, а также я бы рекомендовал указать строку имени уведомления извне объекта (при условии, что вы используете метод уведомления).
Я делаю что-то похожее (с любимым персонажем в главной роли), вот так, но я думаю, что вы многого требуете от пользователей iPhone, когда ячейка направляет людей в другую точку зрения. Прежде всего, я хотел бы проверить вариант раскрытия подробностей о ячейках. Один из вариантов - это готовая кнопка со стрелкой, к которой вы можете прикрепить. Ваш звонок.
Возможно, вам удастся перехватить событие didSelectRowAtIndexPath, а затем выполнить другую логику вместо перенаправления, если касание было на вашем флажке, хотя я не знаю, как вы получите эту позицию. Это означает, что вам может потребоваться найти способ удержать событие касания до того, как оно вызовет путь didSelectRowAtIndex, что я не совсем уверен, как это сделать. Вы еще не работали с TouchBegan и т.п.?
So the "..obviously need to massage some stuff.." comment means "...this code doesn't work...".
So
- (void) viewDidLoad
should be
- (id)initWithFrame:(CGRect)frame
{
if ( self = [super initWithFrame: frame] ){
normalImage = [UIImage imageNamed: @"toggleImageNormal.png"];
selectedImage = [UIImage imageNamed: @"toggleImageSelected.png"];
imageView = [[UIImageView alloc] initWithImage: normalImage];
// set imageView frame
[self addSubview: imageView];
[self addTarget: self action: @selector(toggleImage) forControlEvents: UIControlEventTouchDown];
}
return self;
}
As - (void) viewDidLoad
never gets called.
Есть еще более простой способ сделать это, если вы переопределите touchesBegan: вам нужно сделать оператор if, чтобы решить, находится ли он в зоне действия флажков, если нет, вызовите [super touchesBegan:touches withEvent:event]
и он будет действовать так, как будто он был выбран.
Вот реализация подхода "override touchesBegan:", который я использую, который прост и, кажется, работает хорошо.
Просто включите этот класс в свой проект и создайте и настройте TouchIconTableViewCell
вместо ячейки UITableView
в методе tableView: cellForRowAtIndexPath:
.
TouchIconTableViewCell.h:
#import <UIKit/UIKit.h>
@class TouchIconTableViewCell;
@protocol TouchIconTableViewCellDelegate<NSObject>
@required
- (void)tableViewCellIconTouched:(TouchIconTableViewCell *)cell indexPath:(NSIndexPath *)indexPath;
@end
@interface TouchIconTableViewCell : UITableViewCell {
id<TouchIconTableViewCellDelegate> touchIconDelegate; // note: not retained
NSIndexPath *touchIconIndexPath;
}
@property (nonatomic, assign) id<TouchIconTableViewCellDelegate> touchIconDelegate;
@property (nonatomic, retain) NSIndexPath *touchIconIndexPath;
@end
TouchIconTableViewCell.m:
#import "TouchIconTableViewCell.h"
@implementation TouchIconTableViewCell
@synthesize touchIconDelegate;
@synthesize touchIconIndexPath;
- (void)dealloc {
[touchIconIndexPath release];
[super dealloc];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
CGPoint location = [((UITouch *)[touches anyObject]) locationInView:self];
if (CGRectContainsPoint(self.imageView.frame, location)) {
[self.touchIconDelegate tableViewCellIconTouched:self indexPath:self.touchIconIndexPath];
return;
}
[super touchesBegan:touches withEvent:event];
}
@end
Каждый раз, когда вы создаете или повторно используете ячейку, устанавливайте свойства touchIconDelegate
и touchIconIndexPath
. При прикосновении к вашему значку будет вызван делегат. Затем вы можете обновить значок или что-то еще.