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

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

0 голосов
/ 24 ноября 2011

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

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

Действие обычного IBAction:

- (IBAction)callNumber:(id)sender;

Подключается к кнопке в IB (в Xcode 4).

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

Редактировать

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

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

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

Ответы [ 4 ]

3 голосов
/ 24 ноября 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
}
1 голос
/ 24 ноября 2011

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

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

0 голосов
/ 24 ноября 2011

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

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

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

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

0 голосов
/ 24 ноября 2011

В качестве быстрого временного решения вы можете сделать следующее:

Метод, выбранный ячейкой: - сохранить NSUserDefault для того, какой indexPath.row был выбран

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...