В target-c, как я могу назначить действие событию, когда кто-то нажимает на одну из UITableViewCells, которые были созданы в контроллере UITableView? По сути, общее действие, которое я пытаюсь выполнить, состоит в том, чтобы пользователь мог щелкнуть UITableViewCell, который затем открывает новый контроллер представления, который содержит информацию, которая, в частности, соответствует идентификатору этого UITableViewCell.

0
user9401139 27 Фев 2018 в 21:32

5 ответов

Лучший ответ

Напишите ниже код в вашем файле FirstViewController.m

#import "FirstViewController.h"

@interface FirstViewController ()<UITableViewDelegate,UITableViewDataSource>
{

}
@end
@implementation FirstViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.tableviewName.delegate = self;
    self.tableviewName.dataSource = self;

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    SecoundViewController *secoundVC = [self.storyboard instantiateViewControllerWithIdentifier:@"SecoundVC”];
    secoundVC.cellId = @“pass your data here”; 
    [self.navigationController pushViewController:secoundVC animated:YES];

}

Запишите ниже код в вашем файле SecoundViewController.h

@property (strong, nonatomic) NSString *cellId;

Напишите ниже код в вашем файле SecoundViewController.m

#import "SecoundViewController.h"

@interface SecoundViewController ()
{

}
@end
@implementation SecoundViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    NSLog(@"cellId----%@",self.cellId);

}
0
Rajesh Dharani 1 Мар 2018 в 05:14

Попробуйте с этим кодом:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:
(NSIndexPath *)indexPath
{

    //Perform segue here


}
0
Isaac Bosca 27 Фев 2018 в 18:43

В вашем контроллере DESTINATION (.h):

@property (strong, nonatomic) NSString *idDetail;

Затем в вашем контроллере ORIGIN view (где у вас есть таблица):

@property int idCell;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    self.idCell = indexPath.row
    [self performSegueWithIdentifier:@"detailViewController" sender:sender];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if([segue.identifier isEqualToString:@"detailViewController"]) {
        SecondVC *vc = [segue destinationViewController];
        vc.idDetail = idCell;
    }
}
0
GIJOW 27 Фев 2018 в 19:01

Просто добавьте распознаватель жестов касания при создании ячейки в источнике данных:

override func tableView(_ tableView: UITableView, 
    cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = ...
    if cell.gestureRecognizers.count == 0 {
        var recognizer = UITapGestureRecognizer(target: self, action: 
            #selector(handleCellTap(sender:)))
        recognizer.numberOfTapsRequired = 1
        cell.addGestureRecognizer(recognizer)
    }
}

func handleCellTap(sender: UITapGestureRecognizer) {
    guard let viewCell = sender.view as? UITableViewCell else {
        return
    }
    ...
}

Если ваш источник данных и контроллер имеют один и тот же класс, вы можете просто pushViewController в функции handleCellTap.

Я думаю, что использовать didSelectRowAtIndexPath не то, что вы хотите.

Извините за возможные опечатки, у меня нет XCode для тестирования.

0
Serega 27 Фев 2018 в 19:03

Вы можете достичь этого без использования сегментов. Просто создайте экземпляр контроллера представления из раскадровки и передайте данные (при необходимости) в любые глобальные параметры.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    Session *session = self.arrSessions[indexPath.row];
    ExampleViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"ExampleViewController"];
    controller.selectedSession = session; 
    [self.navigationController pushViewController:controller animated:YES];
}
0
B.Sanyal 27 Фев 2018 в 19:39