Получить indexPath.row в IBAction?

В моем приложении есть табличное представление. Когда строка в представлении таблицы выбрана, появляется UIView и показывает информацию. Заголовок строки берется из файла plist со строками. Файл plist также содержит строки с номером телефона, связанные с заголовком строки. В пользовательском UIView у меня есть кнопка, когда вы нажимаете кнопку, я хочу, чтобы она вызывала номер, который объявлен в файле plist. Число, связанное со строкой, которую щелкнул пользователь.

Как я мог это сделать?

Действие представляет собой обычное действие IBAction:

- (IBAction)callNumber:(id)sender;

Он связан с кнопкой в ​​IB (в Xcode 4).

Буду признателен, если у кого-то есть решение моей проблемы, спасибо.

Изменить

Для некоторой ясности я хотел бы получить номер телефона, связанный со строкой, которую вы выбираете в представлении таблицы. Строка в plist имеет ключ для имени номера телефона: «телефон».

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

«список таблиц» — это NSmutableArray. Я хотел бы получить ключ «телефон» и сохранить его в NSString * phone. Все это в IBAction. Поможет ли опубликовать весь класс?


person Jacob    schedule 23.11.2011    source источник


Ответы (4)


Вам нужно иметь свойство в «настраиваемом представлении», которое указывает путь индекса выбранной строки. Вы можете поместить это в заголовок вашего пользовательского контроллера представления, чтобы объявить это свойство:

@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, чтобы получить строку выбранного пути индекса.

person Alex Nichol    schedule 23.11.2011
comment
Спасибо за быстрый ответ. Выглядит хорошо, но я хотел получить выбранную строку в том же контроллере представления, пользовательское представление — это UIView в том же контроллере представления. Тогда как? Спасибо за вашу помощь! - person Jacob; 24.11.2011
comment
В этом случае просто поместите свойство indexPath в контроллер основного представления, а затем поместите self.indexPath = indexPath в файл tableView:didSelectRowAtIndexPath:. Затем используйте self.indexPath для доступа к текущему выбранному пути индекса. - person Alex Nichol; 24.11.2011
comment
Большое спасибо! Теперь работает отлично. - person Jacob; 24.11.2011

Для этого есть элегантное решение, когда вы настраиваете файл 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
}
person Wayne Hartman    schedule 23.11.2011
comment
Это кажется многообещающим, но я не думаю, что совсем понимаю часть UITableViewCell. - person Jacob; 24.11.2011

Что вы можете сделать в качестве быстрого временного обходного пути, так это следующее:

Cell Selected Method: - сохраните NSUserDefault, для которого был выбран indexPath.row

И в следующем представлении: - прочитайте значение NSUserDefault для любой строки, которая была прочитана

Затем это позволит следующему представлению узнать, какой из них был выбран, и позволит вам получить для него правильные данные.

person Brayden    schedule 23.11.2011

Если у вас есть элементы управления в UITableViewCell, которые выполняют действия, когда вам нужно знать путь к индексу, вы можете использовать несколько методов:

  1. если у вас есть один раздел (или известный раздел для ячеек с элементами управления) и вы не используете свойство tag для чего-то еще, сохраните строку + 1 в свойстве tag. Затем, когда действие вызывается, извлеките sender.tag - 1, и вы получите индекс строки.

  2. идите вверх по цепочке супервизора от вашего контроля, пока не дойдете до UITableViewCell. Вызов [tableView indexPathForCell:cell для получения indexPath.

  3. создайте подкласс вашего элемента управления и сохраните indexPath в элементе управления.

person XJones    schedule 23.11.2011