親UITableViewが複数のセクションで構成されているUITableViewCellのボタンタップを検出したいのですが。
単一のセクションの場合はそれを行うことができましたが、複数のセクションがある場合に正しいセクションを決定するのに苦労しました。
ユーザーがボタンをタップしたUITableViewCellに対応する正しいセクションを特定しようとしています。
問題が解決された後の更新されたコードは次のとおりです。
@property (strong, nonatomic) NSMutableArray* quantityArray;
@property (strong, nonatomic) NSMutableArray* rows;
@synthesize quantityArray,rows;
- (void)viewDidLoad {
[super viewDidLoad];
quantityArray = [[NSMutableArray alloc] init];
[self PluMinusFunction];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//
// Some code here.
//
if (addBtnClicked || minusBtnClicked) {
cell.lblCount.text = [[quantityArray objectAtIndex:indexPath.section-1]objectAtIndex:indexPath.row];
addBtnClicked = NO;
minusBtnClicked = NO;
} else {
cell.lblCount.text = [[quantityArray objectAtIndex:indexPath.section-1]objectAtIndex:indexPath.row];
}
cell.btnMinus.tag = indexPath.row;
cell.btnPlus.tag = indexPath.row;
cell.lblCount.tag = indexPath.row;
[cell.btnPlus addTarget:self action:@selector(addItem:) forControlEvents:UIControlEventTouchUpInside];
if ([ cell.lblCount.text integerValue]!=0) {
[cell.btnMinus addTarget:self action:@selector(deleteItem:) forControlEvents:UIControlEventTouchUpInside];
}
return cell;
}
}
#pragma mark - Plus Minus Button
- (void)PluMinusFunction {
for (int j=0; j <[itemArr count]; j++) {
rows = [[NSMutableArray alloc] init];
for (int i=0; i <[ [[itemArr objectAtIndex:j] objectForKey:@"itemList"]count]; i++) {
[rows insertObject:@"0" atIndex:i];
}
[quantityArray insertObject:rows atIndex:j];
}
[self sum];
}
#pragma mark - UIButton selector
- (void)addItem:(UIButton*)button {
CGPoint touchPoint = [button convertPoint:CGPointZero toView:self.tableView];
NSIndexPath *clickedButtonIndexPath = [self.tableView indexPathForRowAtPoint:touchPoint];
NSInteger row = clickedButtonIndexPath.row;
NSInteger section = clickedButtonIndexPath.section;
NSInteger LabelText =[[[quantityArray objectAtIndex:section-1]objectAtIndex:row]integerValue] + 1;
NSMutableArray *subArray = [quantityArray objectAtIndex:section-1];
[subArray replaceObjectAtIndex:row withObject: [NSString stringWithFormat:@"%ld",(long)LabelText]];
[quantityArray replaceObjectAtIndex:section-1 withObject: subArray];
addBtnClicked = YES;
NSIndexPath* rowToReload = [NSIndexPath indexPathForRow:row inSection:section];
NSArray* rowsToReload = [NSArray arrayWithObjects:rowToReload, nil];
[self.tableView reloadRowsAtIndexPaths:rowsToReload withRowAnimation:UITableViewRowAnimationNone];
}
- (void)deleteItem:(UIButton*)button {
CGPoint touchPoint = [button convertPoint:CGPointZero toView:self.tableView];
NSIndexPath *clickedButtonIndexPath = [self.tableView indexPathForRowAtPoint:touchPoint];
NSInteger row = clickedButtonIndexPath.row;
NSInteger section = clickedButtonIndexPath.section;
NSInteger LabelValue =[[[quantityArray objectAtIndex:section-1]objectAtIndex:row]integerValue];
if (LabelValue >= 1) {
NSInteger LabelText =[[[quantityArray objectAtIndex:section-1]objectAtIndex:row]integerValue] - 1;
NSMutableArray *subArray = [quantityArray objectAtIndex:section-1];
[subArray replaceObjectAtIndex:row withObject: [NSString stringWithFormat:@"%ld",(long)LabelText]];
[quantityArray replaceObjectAtIndex:section-1 withObject: subArray];
addBtnClicked = YES;
NSIndexPath* rowToReload = [NSIndexPath indexPathForRow:row inSection:section];
NSArray* rowsToReload = [NSArray arrayWithObjects:rowToReload, nil];
[self.tableView reloadRowsAtIndexPaths:rowsToReload withRowAnimation:UITableViewRowAnimationNone];
}
}
以下のようなレイアウトを実現したいと思います。
このリンクは私の問題の解決策も与えました:
Objective-C
-(void)addItem:(UIButton*) sender
{
CGPoint touchPoint = [sender convertPoint:CGPointZero toView:mainTable]; // maintable --> replace your tableview name
NSIndexPath *clickedButtonIndexPath = [mainTable indexPathForRowAtPoint:touchPoint];
NSLog(@"index path.section ==%ld",(long)clickedButtonIndexPath.section);
NSLog(@"index path.row ==%ld",(long)clickedButtonIndexPath.row);
}
Swift
func addItem(sender: UIButton)
{
var touchPoint = sender.convert(CGPoint.zero, to: self.maintable)
// maintable --> replace your tableview name
var clickedButtonIndexPath = maintable.indexPathForRow(at: touchPoint)
NSLog("index path.section ==%ld", Int(clickedButtonIndexPath.section))
NSLog("index path.row ==%ld", Int(clickedButtonIndexPath.row))
}
Swift2以降
func addItem(sender: UIButton)
{
var touchPoint: CGPoint = sender.convertPoint(CGPointZero, toView: mainTable)
// maintable --> replace your tableview name
var clickedButtonIndexPath: NSIndexPath = mainTable(forRowAtPoint: touchPoint)
NSLog("index path.section ==%ld", Int(clickedButtonIndexPath.section))
NSLog("index path.row ==%ld", Int(clickedButtonIndexPath.row))
}
Swift 3
let clickedButtonIndexPath = self.tableView.indexPathForRow(at: touchPoint)
if(clickedButtonIndexPath != nil)
{
NSLog("index path.section ==%ld", Int(clickedButtonIndexPath!.section))
NSLog("index path.row ==%ld", Int(clickedButtonIndexPath!.row))
}
CGPoint
を使用せずにUIを想定せずにインデックスパスを取得するより直接的な方法は、.superview
。これは実際にはより信頼できると思います。
- (myTableViewCell *)cellContainingView:(UIView *)view
{
do {
view = view.superview;
} while (view != nil && ![view isKindOfClass:[myTableViewCell class]]);
return (myTableViewCell *)view;
}
次に、ボタンアクションでこれを行うだけです。
- (IBAction)myButtonPressed:(id)sender
{
myTableViewCell *cell = [self cellContainingView:(UIView *)sender];
NSIndexPath *path = [self.tableView indexPathForCell:cell];
}