在IBAction中获取indexPath.row?

时间:2011-11-23 21:38:55

标签: objective-c uibutton plist ibaction nsindexpath

在我的应用程序中有一个表格视图。当选择表视图中的行时,会出现UIView并显示信息。 行标题来自包含字符串的plist文件。 plist文件还包括具有与行标题相关联的电话号码的字符串。 在自定义UIView中我有一个按钮,当你点击按钮我希望它调用plist文件中声明的数字。 与用户单击的行关联的数字。

我怎么能做到这一点?

该行动是普通的IBAction:

- (IBAction)callNumber:(id)sender;

它连接到IB中的按钮(在Xcode 4中)。

如果有人能解决我的问题,我将不胜感激,谢谢。

修改

为了清楚起见,我想获取与您在表格视图中选择的行相关联的电话号码。 plist中的字符串有一个键,用于电话号码名称:“phone”。

NSString *phone = [[tableList objectAtIndex:indexPath.row] objectForKey:@"phone"];

“tablelist”是一个NSMutableArray。我想获得关键的“手机”并将其存储在NSString *手机中。所有这些都在IBAction中。发表整个课程会有所帮助吗?

4 个答案:

答案 0 :(得分:3)

有一个优雅的解决方案,就是在设置UITableViewCell时。将UIButton的标记设置为行的索引:

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString* CellIdentifier = @"Cell";

    YourCustomCell* cell = (YourCustomCell*)[tableView 
                              dequeueReusableCellWithIdentifier:CellIdentifier];

    //  All the code for loading a cell

    //  Other code you have for configuring the cell

    //  HERE'S THE IMPORTANT PART: SETTING THE
    //  BUTTON'S TAG TO THE INDEX OF THE ROW
    cell.phoneButton.tag = indexPath.row;

    return cell;    
}

然后,在操作代码中,您可以将索引拉出标记:

- (IBAction)callNumber:(id)sender {
    UIButton* button = sender;
    int index = button.tag;
    NSString *phone = [[tableList objectAtIndex:indexPath.row] objectForKey:@"phone"];
    //  Make the phone call
}

答案 1 :(得分:1)

您需要在“自定义视图”上拥有一个属性,该属性指示所选行的索引路径。您可以将其放在自定义视图控制器的标头中以声明此属性:

@interface MyCustomViewController : UIViewController {
    ...
    NSIndexPath * indexPath;
}
@property (nonatomic, retain) NSIndexPath * indexPath;

然后,设置如下的实现:

@implementation MyCustomViewController
@synthesize indexPath;
...
// only needed if not using ARC
- (void)dealloc {
    self.indexPath = nil;
    ...
    [super dealloc];
}
@end

现在,在tableView:didSelectRowAtIndexPath:方法中,只需像往常一样创建视图控制器,但在其上设置indexPath属性,以便将来可以访问它:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    MyCustomViewController * vc = [[MyCustomViewController alloc] initWithBundle:nil nibName:nil];
    [vc setIndexPath:indexPath];
    [self presentModalViewController:vc];
    // if not using ARC
    [vc release];
}

然后,在MyCustomViewController.m中的任何位置,只需编写self.indexPath.row即可获取所选索引路径的行。

答案 2 :(得分:0)

您可以采取以下快速临时解决方法:

细胞选择方法: - 为选择了indexPath.row保存NSUserDefault

在你的下一个观点中: - 读取任何行读取的NSUserDefault值

然后,这将让下一个视图知道选择了哪一个,并允许您为其获取正确的数据。

答案 3 :(得分:0)

如果您在UITableViewCell中有控件执行需要知道索引路径的操作,则可以使用以下几种方法:

  1. 如果您有一个部分(或具有控件的单元格的已知部分)并且没有将tag属性用于其他内容,请将行+ 1存储在tag中属性。然后,当调用该操作时,检索sender.tag - 1并获得行索引。

  2. 从你的对照中走出超级视图链,直到你到达UITableViewCell。调用[tableView indexPathForCell:cell来获取indexPath。

  3. 创建控件的子类并将indexPath存储在控件中。