Кроме того, я предлагаю, чтобы Вы использовали Google библиотеки API Ajax, для загрузки внешних библиотек.
Это - инструмент разработчика Google, которые связывают библиотеки JavaScript крупных фирм и облегчают развертывать, обновлять и делать их легче, всегда используя сжатые версии.
кроме того, это делает Ваш проект более простым и легче, потому что Вы не должны загружать, скопируйте и поддержите файлы библиотек тезисов в своем проекте.
Использование это этот путь:
google.load("jquery", "1.2.3");
google.load("jqueryui", "1.5.2");
google.load("prototype", "1.6");
google.load("scriptaculous", "1.8.1");
google.load("mootools", "1.11");
google.load("dojo", "1.1.1");
В примере Apple Accessory используется следующий метод:
[button addTarget:self action:@selector(checkButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
Затем в обработчике касания извлекается координата касания, и путь индекса вычисляется на основе этой координаты:
- (void)checkButtonTapped:(id)sender
{
CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition];
if (indexPath != nil)
{
...
}
}
, вы можете использовать шаблон тега:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *identifier = @"identifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (cell == nil) {
cell = [[UITableView alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
[cell autorelelase];
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(10, 5, 40, 20)];
[button addTarget:self action:@selector(buttonPressedAction:) forControlEvents:UIControlEventTouchUpInside];
[button setTag:[indexPath row]]; //use the row as the current tag
[cell.contentView addSubview:button];
[button release];
}
UIButton *button = (UIButton *)[cell viewWithTag:[indexPath row]]; //use [indexPath row]
[button setTitle:@"Edit" forState:UIControlStateNormal];
return cell;
}
- (void)buttonPressedAction:(id)sender
{
UIButton *button = (UIButton *)sender;
//button.tag has the row number (you can convert it to indexPath)
}
Я бы использовал свойство тега, как вы сказали, установив тег следующим образом:
[button setTag:indexPath.row];
затем получив тег внутри buttonPressedAction следующим образом:
((UIButton *)sender).tag
Или
UIButton *button = (UIButton *)sender;
button.tag;
Я всегда использую теги.
] Вам необходимо создать подкласс UITableviewCell
и обрабатывать нажатие кнопки оттуда.
Хотя мне нравится способ использования тегов ... если вы не хотите использовать теги по какой-либо причине,
вы можете создать элемент NSArray
готовых кнопок:
NSArray* buttons ;
, затем создать эти кнопки перед рендерингом tableView и вставить их в массив.
Затем внутри tableView: cellForRowAtIndexPath:
, вы можете выполнить:
UIButton* button = [buttons objectAtIndex:[indexPath row] ] ;
[cell.contentView addSubview:button];
Затем в функции buttonPressedAction:
вы можете выполнить
- (void)buttonPressedAction:(id)sender {
UIButton* button = (UIButton*)sender ;
int row = [buttons indexOfObject:button] ;
// Do magic
}
Found a nice solution to this problem elsewhere, no messing around with tags on the button:
- (void)buttonPressedAction:(id)sender {
NSSet *touches = [event allTouches];
UITouch *touch = [touches anyObject];
CGPoint currentTouchPosition = [touch locationInView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint: currentTouchPosition];
// do stuff with the indexPath...
}
Я обнаружил, что метод использования супервью для получения ссылки на indexPath ячейки работает отлично. Спасибо iphonedevbook.com (macnsmith) за подсказку link text
-(void)buttonPressed:(id)sender {
UITableViewCell *clickedCell = (UITableViewCell *)[[sender superview] superview];
NSIndexPath *clickedButtonPath = [self.tableView indexPathForCell:clickedCell];
...
}
Я что-то упустил? Разве вы не можете просто использовать отправителя для идентификации кнопки. Отправитель предоставит вам такую информацию:
<UIButton: 0x4b95c10; frame = (246 26; 30 30); opaque = NO; tag = 104; layer = <CALayer: 0x4b95be0>>
Затем, если вы хотите изменить свойства кнопки, скажите фоновое изображение, которое вы просто сообщите отправителю:
[sender setBackgroundImage:[UIImage imageNamed:@"new-image.png"] forState:UIControlStateNormal];
Если вам нужен тег, то метод ACBurk подойдет.
// how do I know which button sent this message?
// processing button press for this row requires an indexPath.
На самом деле довольно просто:
- (void)buttonPressedAction:(id)sender
{
UIButton *button = (UIButton *)sender;
CGPoint rowButtonCenterInTableView = [[rowButton superview] convertPoint:rowButton.center toView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:rowButtonCenterInTableView];
MyTableViewItem *rowItem = [self.itemsArray objectAtIndex:indexPath.row];
// Now you're good to go.. do what the intention of the button is, but with
// the context of the "row item" that the button belongs to
[self performFooWithItem:rowItem];
}
Хорошо работает для меня: P
если вы хотите изменить настройку целевого действия, вы можете включить параметр события в метод, а затем использовать касания этого события для разрешения координаты касания. Координаты по-прежнему необходимо разрешить в границах сенсорного представления, но некоторым это может показаться проще.