2015-03-12 3 views
1

В основном я хочу удалить строку при нажатии кнопки, которая является частью этой строки.
Я не могу использовать стиль редактирования фиксации, потому что я хочу выполнить отписку и удалить с помощью той же кнопки.
enter image description hereУдалите строку UITableView, щелкнув на пользовательском UIButton

При нажатии на кнопку подписки я хочу удалить эту конкретную строку.
так что любая идея, как я могу это сделать.

+0

Вы всегда можете отметить решение, которое наиболее помогли вам в качестве правильного ответа (галочка под точками). – Yoko

ответ

3

Он работает со следующим кодом

На кнопку мыши событие

CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.table]; 
    NSIndexPath *indexPath = [self.table indexPathForRowAtPoint:buttonPosition]; 
    [self.arraylist removeObjectAtIndex:indexPath.row]; 
    [self.table deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
0

Вы можете получить позицию кнопки нажал, чтобы найти indexPath и оттуда найти ячейку, которая имеет эту кнопку:

var position: CGPoint = sender.locationInView(self.tableView) 
var indexPath: NSIndexPath = self.tableView.indexPathForRowAtPoint(position)!  
var cell = self.tableView(tableView, cellForRowAtIndexPath: indexPath) 
1

При создании строки в cellForRowAtIndexPath назначения в indexPath.row к тег, хорошая идея кнопки, чтобы добавить некоторое количество, чтобы избежать путаницы с кнопкой другие, например:

cell.deleteButton.tag = 100 + indexPath.row 

при нажатии на кнопку отливать отправителя кнопку, восстановить тег баттона (не забудьте вычесть 100) и вы k теперь какую строку вы хотите удалить.

+0

@Bhavin, что вы имеете в виду, не будет работать? Можете ли вы опубликовать код? – Greg

+0

Я хочу сказать. Я получил тег ok, теперь с этим тегом, как удалить эту ячейку. –

+0

@Bhavin опубликовать код, как удалить ячейку. – Greg

-1

Касание строки и удаление должно быть возможно таким образом, как это: в вашем didSelectRowAtIndexPath вы можете осуществить следующие действия:

[myArrayWithSubscriptions removeObjectAtIndex:indexPath.row]; 
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 

Если вы хотите только нажать UIButton для удаления использовать этот код в действие, выполняющее UIButton.

CGPoint point; 
NSIndexPath *indexPath; 
point = [sender.center locationInView:tableView]; 
indexPath = [tableView indexPathForRowAtPoint:point]; 
[myArrayWithSubscriptions removeObjectAtIndex:indexPath.row]; 
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 

Таким образом, у вас есть indexPath из клетки, которые были его UIButton прослушиваются, и должны быть в состоянии продолжать, чтобы удалить его. Я набираю это на ходу и проверю этот код позже для любых опечаток.

+0

Нажатие кнопки внутри ячейки не вызовет 'tableView: didSelectRowAtIndexPath:' – avismara

+0

@codingVoldemort. Я хотел бы попросить вас перечитать мой ответ. Я никогда не говорил, что нажатие кнопки сделает это. Прочитайте: нажатие строки и удаление ее должно быть возможно таким образом, как это ... Я сказал строку. Впоследствии я даже включил решение для нажатия кнопки. Проголосовать не очень хорошо ... – Yoko

2

a. Добавить цель и обратный вызов к кнопке (предположим, вы уже это сделали)

b. В функции обратного вызова, цикл по superviews, чтобы найти UITableViewCell, а затем найти индекс него, например, так:

-(void)deleteButtonPressed:(UIButton*)button { 
    UIView* candidate = button; 
    while (![candidate isKindOfClass:[UITableViewCell class]]) { 
     candidate = candidate.superview; 
    } 
    NSIndexPath* indexPathToDelete = [self.tableView indexPathForCell:cell]; 
    ... 

гр. Обновите свою модель (очень важно)

[self.dataArrayThatFeedsTableView removeObjectAtIndex:indexPathToDelete.item] 

d. Вызовите Удалить строку

[self.tableView deleteItemsAtIndexPaths:@[indexPathToDelete]]; 
+0

Хороший способ получить ссылку 'UITableViewCell'! Но разве вы не думаете, что это перебор? Just sayin ':) – avismara

+0

В моих проектах кнопки иногда вложены глубоко в представление, поэтому вместо того, чтобы предполагать, что это 2 или 3 уровня, лучше иметь функцию утилиты, которая просто возвращает ячейку для любых дочерних элементов. Он также выглядит лучше, чем button.superview.superview.superview ;-) –

+0

Рассмотрите возможность использования рекурсии! – avismara

0

Вы должны получить indexPath кнопки, которая прослушивается. Затем удалите выбранные пути индекса, используя стандартный вызов API.Как так:

- (IBAction) didTapSubscribeButton:(UIButton*)sender { 
    UIView* candidate = button; 
    while (![candidate isKindOfClass:[UITableViewCell class]]) { 
     candidate = candidate.superview; 
    } 
    NSIndexPath* indexPathToDelete = [self.tableView indexPathForCell:candidate]; 
    [self.dataSourceArray removeObjectAtIndex:indexPath.row] //Considering that this is a single data source table view. 
    NSArray *indexPaths = [NSArray alloc]initWithObjects:@[indexPath],nil]; 
    [self.tableView beginUpdates]; 
    tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade]; 
    [self.tableView endUpdates]; 
    } 
+0

[UIButton locationInView:]: нераспознанный селектор, отправленный в экземпляр –

+0

Отредактировано с должным уважением к '' циклу @ @ Майка – avismara

+0

все еще не работает –

0

Сделать вспомогательный класс UIButton как CellButton с принятием настраиваемого свойства, как этот

@property (nonatomic,strong) NSIndexPath *indexPath; 

установить пользовательское свойство класса для кнопки в качестве нового, созданных и в cellForRowAtIndexPath

cell.btnSubscribe.indexPath=indexPath; 
[cell.btnSubscribe addTarget:self action:@selector(subscribe:) forControlEvents:UIControlEventTouchUpInside]; 

теперь функции

-(IBAction)subscribe:(id)sender{ 
    CellButton *button=(CellButton *)sender; 
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:button.indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
} 

попытайтесь ответить на этот вопрос. Я уверен, что это будет работать

Смежные вопросы