2012-08-13 25 views
8

Tôi đã thêm UIButton vào UITableViewCells. Tôi có khi người dùng nhấp vào nút, chúng tôi đã nhận được đường dẫn chỉ mục để sử dụng các giá trị từ NSMutableArray. Tôi đã sử dụng dưới đây để có được hiện tại IndexPath,Làm thế nào để vượt qua UITableView IndexPath để UIButton @selector theo tham số trong iOS?

[getMeButton addTarget:self action:@selector(resendTheErrorMessage:) forControlEvents:UIControlEventTouchUpInside]; 

-(void) resendTheErrorMessage:(id)sender 
{ 
    NSLog(@"SEnder: %@", sender); 
    //NSLog(@"Index Path : %@", indexpath); 
} 

bất cứ ai có thể vui lòng giúp tôi vượt qua indexPath hiện UIButton's @selector. Cảm ơn trước.

EDIT:

Đây là sản phẩm tôi nhận được từ NSLog()

<UIButton: 0x864d420; frame = (225 31; 95 16); opaque = NO; tag = 105; layer = <CALayer: 0x864d570>> 
+0

Bạn có thể đặt thẻ cho các nút của mình theo số hàng của ô của bạn, sau đó bạn có thể dễ dàng lấy được cellIndex. Hiển thị mã nơi bạn đã thêm nút của mình trên phương thức cellForRowAtIndexPath :)? – TheTiger

+0

@VakulSaini Cảm ơn. Tôi đã không nhận được cellIndex từ (id) người gửi. Tôi đã chỉnh sửa câu hỏi của mình, vui lòng xem phần này. Cảm ơn. –

+0

Bạn nhận được điều này vì bạn đang in id của 'UIButton'. Xem bài đăng của tôi để nhận được cellIndex – TheTiger

Trả lời

30

Thêm bạn UIButton Như thế này

UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
[btn setFrame:CGRectMake(10.0, 2.0, 140.0, 40.0)]; 
[btn setTitle:@"ButtonTitle" forState:UIControlStateNormal]; 
[btn addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; 
[btn setTag:indexPath.row]; 
[cell.contentView addSubview:btn]; 

Và sau đó nhận được số thẻ của mình -

-(void)buttonClicked:(id)sender 
{ 
    NSLog(@"tag number is = %d",[sender tag]); 
    //In this case the tag number of button will be same as your cellIndex. 
    // You can make your cell from this. 

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[sender tag] inSection:0]; 
    UITableViewCell *cell = [tblView cellForRowAtIndexPath:indexPath]; 
} 

Lưu ý:Trên giải pháp sẽ làm việc khi tableView của bạn chỉ có 1 phần. Nếu tableView của bạn có nhiều hơn một phần hoặc bạn nên biết chỉ mục phần của bạn hoặc đi cho các phương pháp dưới đây.

Alternative: 1

UIView *contentView = (UIView *)[sender superview]; 
UITableViewCell *cell = (UITableViewCell *)[contentView superview]; 
NSIndexPath *indexPath = [tblView indexPathForCell:cell]; 

Alternative: 2

CGPoint touchPoint = [sender convertPoint:CGPointZero toView:tblView]; 
NSIndexPath *indexPath = [tblView indexPathForRowAtPoint:touchPoint]; 
UITableViewCell *cell = [tblView cellForRowAtIndexPath:indexPath]; 
+0

Tính năng này có hoạt động khi TableView có nhiều hơn một phần không? –

+1

Đầu tiên sẽ không hoạt động vì trong này bạn sẽ phải biết chỉ số phần .... nhưng giải pháp thay thế sẽ làm việc ...... – TheTiger

+0

@TheTiger cảm ơn người đàn ông nó hoàn toàn làm việc ... – Ryuk

2

Nếu bạn chỉ cần dòng của bảng, sau đó bạn có thể thiết lập thuộc tính tag của nút với số liên tiếp. Nếu bạn cần toàn bộ đường dẫn (với số phần) thì bạn sẽ phải phân lớp UIButton và tạo một thuộc tính mới ("indexPath" sẽ là một tên tốt) mà bạn sẽ đặt khi bạn thêm nút vào hàng của bảng.

+0

Tôi không nghĩ rằng điều này sẽ làm việc. AFAIK bạn không thể vượt qua các thông số của riêng bạn trên một hành động: @selector? –

+0

Phần nào sẽ không hoạt động? Không yêu cầu thêm thông số nào; ý tưởng là mã hóa thông tin chỉ mục trong chính đối tượng nút tại thời điểm nó được thêm vào bảng, hoặc thông qua thuộc tính thẻ hoặc thuộc tính tùy chỉnh của một lớp con. Phương thức thẻ là phương thức được sử dụng trong câu trả lời được chấp nhận cho câu hỏi này. – sgress454

6

Cho rằng nút là một subview của tế bào xem, và rằng xem bảng biết chỉ số đường dẫn của chế độ xem ô, một cái gì đó như thế này sẽ hoạt động:

- (UITableViewCell *)containingCellForView:(UIView *)view 
{ 
    if (!view.superview) 
     return nil; 

    if ([view.superview isKindOfClass:[UITableViewCell class]]) 
     return (UITableViewCell *)view.superview; 

    return [self containingCellForView:view.superview]; 
} 

- (IBAction)buttonClicked:(id)sender 
{ 
    UITableViewCell *containingCell = [self containingCellForView:sender]; 
    if (containingCell) { 
     NSIndexPath *indexPath = [self.tableView indexPathForCell:containingCell]; 
     NSLog(@"Section: %i Row: %i", indexPath.section, indexPath.row); 
    } 
} 
+0

Điều này sẽ hiệu quả, nhưng bạn có để đảm bảo rằng nút là một chế độ xem con * trực tiếp của ô bảng (thường là). – sgress454

+0

Và thêm subView để trực tiếp cell.view là không tốt ...! Chúng tôi thêm nó vào cell.contentView .... Vâng ý tưởng là tốt :-) – TheTiger

+0

Nó là tốt nếu bạn đang thiết lập nó để được xem phụ kiện của tế bào - câu hỏi ban đầu đã không xác định nơi nó đã được thêm vào. Rõ ràng nếu nó là n cấp độ xuống trong một hệ thống phân cấp xem thì bạn phải đi n cấp trở lại để có được để xem tế bào. –

0

cho tôi hoạt động nếu add thẻ để nút trong cellForRowAtIndexPath ...

cell.button.tag = indexPath.row; 

và trong lớp tế bào nhận được thẻ ... Ví dụ:

NSLog(@"tag number is = %d",[sender tag]); 

whit mà bạn có thể biết cell.row. điều này cũng phù hợp với tôi, Xin lỗi vì tiếng anh của tôi.

1

Đối với một tableview với nhiều hơn một phần một giải pháp đơn giản sẽ được gán tag:

cell.button.tag = indexPath.section * 1000 + indexPath.row 

Trong việc sử dụng xử lý sự kiện:

let section = sender.tag/1000 
let row = sender.tag % 1000 

Lưu ý rằng bạn cần phải nhân với một số lớn hơn 1000 nếu bất kỳ phần nào của bạn có thể chứa từ 1000 hàng trở lên.

Các vấn đề liên quan