2016-01-15 64 views
2

我有這樣的cellForRowAtIndexPath方法在這裏:Objective-C的傳遞的tableView indexPath另一個方法

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 

    if (cell.accessoryView == nil) { 

     cell.accessoryView = [[Checkbox alloc] initWithFrame:CGRectMake(0, 0, 25, 43)]; 
     cell.accessoryView.opaque = NO; 
     cell.backgroundColor = [UIColor clearColor]; 

     [(Checkbox*)cell.accessoryView addTarget:self action:@selector(checkBoxTapped:forEvent:) forControlEvents:UIControlEventValueChanged]; 
    } 

    NSString *sectionTitle = [contactSectionTitles objectAtIndex:indexPath.section]; 
    NSArray *sectionContacts = [contactDirectoryFinal objectForKey:sectionTitle]; 
    NSString *contacts = [[sectionContacts objectAtIndex:indexPath.row] valueForKey:@"item"]; 

    cell.textLabel.text = contacts; 
    [(Checkbox*)cell.accessoryView setChecked: [[[sectionContacts objectAtIndex:indexPath.row] valueForKey:@"checkedItem"] boolValue] ]; 

    return cell; 
} 

這個方法裏面,我有這樣一行:

[(Checkbox*)cell.accessoryView addTarget:self action:@selector(checkBoxTapped:forEvent:) forControlEvents:UIControlEventValueChanged]; 

調用該方法

- (IBAction)checkBoxTapped:(id)sender forEvent:(UIEvent*)event 
{ 
} 

我想要做的是調整這個方法的調用方式,所以我也通過int indexPath.row數

我開始了這一點:

[(Checkbox*)cell.accessoryView addTarget:self action:@selector(checkBoxTapped:forEvent:rowNumber:) forControlEvents:UIControlEventValueChanged]; 

- (IBAction)checkBoxTapped:(id)sender forEvent:(UIEvent*)event rowNumber:(int)row 
{ 
} 

,但我是新來的選擇,我的問題是我在哪裏傳中ROWNUMBER?

+0

訪問的UITableViewCell對象您是否嘗試過使用'accessoryButtonTappedForRowWithIndexPath :(NSIndexPath *)indexPath'? – CaptJak

回答

0

作爲替代傳遞中....

func checkBoxTapped(sender: CheckBox, withEvent event: UIEvent) { 
    if let tap = event.allTouches()?.first { 
     let location = tap.locationInView(tableView) 
     let indexPath = tableView.indexPathForRowAtPoint(location) 
     ..... do something 
    } 
} 
+1

這個問題被標記爲Objective-C。問題中的代碼是Objective-C。請用適當的語言發佈答案。 – rmaddy

0

*更新

由於@Maddy的評論

不要使用標籤來表示indexPath 。如果表視圖允許任何行移動,插入或刪除

,這不是一個很好的答案失敗。*

由於CheckBoxUIView你可以設置它的標籤在cellForRowAtIndexPath:再檢查它在checkBoxTapped:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 

if (cell.accessoryView == nil) { 

    cell.accessoryView = [[Checkbox alloc] initWithFrame:CGRectMake(0, 0, 25, 43)]; 
    cell.accessoryView.opaque = NO; 
    cell.backgroundColor = [UIColor clearColor]; 

    [(Checkbox*)cell.accessoryView addTarget:self action:@selector(checkBoxTapped:forEvent:) forControlEvents:UIControlEventValueChanged]; 
} 

NSString *sectionTitle = [contactSectionTitles objectAtIndex:indexPath.section]; 
NSArray *sectionContacts = [contactDirectoryFinal objectForKey:sectionTitle]; 
NSString *contacts = [[sectionContacts objectAtIndex:indexPath.row] valueForKey:@"item"]; 

cell.textLabel.text = contacts; 
[(Checkbox*)cell.accessoryView setChecked: [[[sectionContacts objectAtIndex:indexPath.row] valueForKey:@"checkedItem"] boolValue] ]; 
// set the index to the tag. 
cell.accessoryView.tag = indexPath.row 
return cell; 

}

- (IBAction)checkBoxTapped:(id)sender forEvent:(UIEvent*)event 
{ 
    // get the index from the tag value 
    NSInteger row = ((UIView *)sender).tag 
} 
+2

請勿使用'tag'來表示indexPath。如果表視圖允許任何行被移動,插入或刪除,則失敗。 – rmaddy

+0

@maddy好點。謝謝。 – Ismail

1

正如你發現的那樣,你不能僅僅通過發送者和事件傳遞任何值。這就是爲什麼你需要另一種方式來傳遞行號。

一種方法是在您的控件上使用標籤屬性並使用[sender tag]檢索它,但是如果在不調用cellForRowAtIndexPath的情況下更改表索引,則此方法將失敗。它也不適用於分區表格視圖。

更健壯的方法是使用視圖的位置來計算正確的行。UITableView中有一個方便的方法來做到這一點:

- (IBAction)checkBoxTapped:(id)sender forEvent:(UIEvent*)event { 
    CGPoint checkBoxPosition = [sender convertPoint:CGPointZero toView:self.tableView]; 
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:checkBoxPosition]; 
} 
+1

請勿使用'tag'來表示indexPath。如果表視圖允許任何行被移動,插入或刪除,則失敗。 – rmaddy

+0

好點,我會刪除它,只是離開另一種方法。 –

0

你可以使用:

- (NSIndexPath *)indexPathForCell:(UITableViewCell *)cell

一旦你擁有了它可以作爲sender.superview

+0

這是一個糟糕的假設。您不應該認爲發件人的超級視圖實際上是單元格。超級觀點很可能是細胞的一些子視圖。 – rmaddy

相關問題