Обработка событий в tableView

То, что я пытаюсь сделать, это обрабатывать сенсорные события, чтобы при прикосновении к экрану я хотел предпринять какое-то действие. Например, изменение цвета фона Что я пробовал: // Я создал подкласс контроллера табличного представления

override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
     tableView.backgroundColor = UIColor.orangeColor()
}

это не сработало, я подозревал, что tvc не может быть первым ответчиком, поэтому табличное представление обрабатывает события касания. Итак, я попытался:

 override func viewDidLoad() {
     super.viewDidLoad()
     tableView.resignFirstResponder()    
}

Также пробовал:

override func becomeFirstResponder() -> Bool {
    return true
}

override func canBecomeFirstResponder() -> Bool {
    return true
}

Ни один из них не работает. Как я могу обрабатывать события? Что мне не хватает?

ИЗМЕНИТЬ

Выбранный ответ с точки зрения нативного быстрого кода:

override func viewDidLoad() {
        super.viewDidLoad()

        var tapGestureRecognizer = UITapGestureRecognizer(target: self, action: "tap:")
        tapGestureRecognizer.cancelsTouchesInView = true
        self.tableView.addGestureRecognizer(tapGestureRecognizer)




    }

    func tap(recognizer: UITapGestureRecognizer) {
        if recognizer.state == UIGestureRecognizerState.Ended {
            var tapLocation  = recognizer.locationInView(self.tableView)
            var tapIndexPath : NSIndexPath? = self.tableView.indexPathForRowAtPoint(tapLocation)

            if let index = tapIndexPath  {

                self.tableView(self.tableView, didSelectRowAtIndexPath: index)
            } else {
                self.tableView.backgroundColor = UIColor.orangeColor()
            }
        }

    }

person Salihcyilmaz    schedule 29.04.2015    source источник
comment
Чего вы пытаетесь достичь? Вы хотите, чтобы что-то происходило при выборе ячейки или просто при нажатии на экран?   -  person ABakerSmith    schedule 29.04.2015
comment
Собственно, основной план состоит в том, чтобы создать новую ячейку при касании. В учебных целях я экспериментирую с другими свойствами. Поэтому я попытался изменить цвет фона tableView здесь. Но не мог сделать   -  person Salihcyilmaz    schedule 29.04.2015
comment
Почему вы пытаетесь обнаружить прикосновение в TableView, так как внутри него есть ячейка, которая получит прикосновение.   -  person Vizllx    schedule 29.04.2015
comment
Как я упоминал в своем предыдущем комментарии, главное — создать новую ячейку при касании tableView. Рассмотрим tableView dataArray = [1,2]. Они будут напечатаны на экране, верно? Но экран будет заполнен некоторыми дополнительными ячейками, которые не получат сообщение didSelectRowAtIndexPath. Поэтому мне нужен какой-то другой способ предпринять какие-то действия, когда эти дополнительные ячейки будут затронуты.   -  person Salihcyilmaz    schedule 29.04.2015


Ответы (2)


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

- (void)addTapGestureForListTable {
    UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userTappedOnView:)];
    tapGestureRecognizer.cancelsTouchesInView = YES;
    [self.tableView addGestureRecognizer:tapGestureRecognizer];
}

А затем реализуйте метод userTappedOnView. Если вы хотите различать прикосновения к ячейкам или нет, реализуйте это так:

- (void)userTappedOnView:(UITapGestureRecognizer *)recognizer {
    if (recognizer.state == UIGestureRecognizerStateEnded) {
        CGPoint tapLocation = [recognizer locationInView:self.tableView];
        NSIndexPath *tapIndexPath = [self.tableView indexPathForRowAtPoint:tapLocation];
        if (tapIndexPath) {
            [self tableView:self.tableView didSelectRowAtIndexPath:tapIndexPath];
        }
    }
}

Если вы хотите реагировать на прикосновения к ячейке, вы должны сделать так, чтобы ваш делегат tableView указывал на контроллер. В viewDidLoad выполните:

self.tableView.delegate = self;

И затем реализовать метод

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
person Pauls    schedule 29.04.2015
comment
Потрясающий. Очень хороший ответ с точки зрения obj-c. Последние 40 минут я пытался перевести это в собственный код Swift. Во всяком случае, у меня это работает сейчас. - person Salihcyilmaz; 29.04.2015

Хорошо, не уверен, что это то, что вы ищете, но я думаю, вам все же лучше обрабатывать действия tableView через встроенные методы. Используйте пользовательские UITableViewCells и определите, что делать в зависимости от подкласса ячейки.

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    var selectedCell = tableView.cellForRowAtIndexPath(indexPath)

    if let addTableViewCell = selectedCell as? AddNewTableViewCell {
        insertNewObject(addTableViewCell)
    } else if let someOtherTableViewCell = selectedCell as? SomeOtherTableViewCell {
        // Do something else
    }
}

// Copied from the Xcode template
func insertNewObject(sender: AnyObject) {
    objects.insert(NSDate(), atIndex: 0)
    let indexPath = NSIndexPath(forRow: 0, inSection: 0)
    self.tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)
}
person Allan Chau    schedule 29.04.2015
comment
Привет. Основной план состоит в том, чтобы создать новую ячейку при касании tableView. Рассмотрим tableView dataArray = [1,2]. Они будут напечатаны на экране, верно? Но экран будет заполнен некоторыми дополнительными ячейками, которые не получат сообщение didSelectRowAtIndexPath. Поэтому мне нужен какой-то другой способ предпринять какие-то действия, когда эти дополнительные ячейки будут затронуты. - person Salihcyilmaz; 29.04.2015