Пользовательская ячейка представления таблицы не перемещается

У меня есть TableViewController с одной настраиваемой ячейкой прототипа с идентификатором «regularCell», установленным в раскадровке. TableViewController относится к классу TimelineTableViewController.swift, а ячейка относится к классу TimelineTableViewCell.swift.swift, оба из которых установлены в раскадровке.

В TimelineTableViewController.swift:

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.events.count
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = self.tableView.dequeueReusableCellWithIdentifier("regularCell", forIndexPath: indexPath) as! TimelineTableViewCell
    cell.selectionStyle = .None
        let event = events[indexPath.row]
        cell.content.text = event.content
        cell.name.text = event.name
        cell.metadata.text = event.metadata
        return cell
    }

}

И в TimelineTableViewCell.swift я пытаюсь сделать ячейку прокручиваемой, но ничего не происходит, и распознаватель жестов панорамирования не вызывается.

import UIKit

class TimelineTableViewCell: UITableViewCell {

var originalCenter = CGPoint()
var deleteOnDragRelease = false

@IBOutlet weak var name: UILabel!
@IBOutlet weak var content: UILabel!
@IBOutlet weak var metadata: UILabel!

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    var recognizer = UIPanGestureRecognizer(target: self, action: "handlePan:")
    recognizer.delegate = self
    addGestureRecognizer(recognizer)
}

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

func handlePan(recognizer: UIPanGestureRecognizer) {
    // 1
    if recognizer.state == .Began {
        // when the gesture begins, record the current center location
        originalCenter = center
    }
    // 2
    if recognizer.state == .Changed {
        let translation = recognizer.translationInView(self)
        center = CGPointMake(originalCenter.x + translation.x, originalCenter.y)
        // has the user dragged the item far enough to initiate a delete/complete?
        deleteOnDragRelease = frame.origin.x < -frame.size.width / 2.0
    }
    // 3
    if recognizer.state == .Ended {
        // the frame this cell had before user dragged it
        let originalFrame = CGRect(x: 0, y: frame.origin.y,
            width: bounds.size.width, height: bounds.size.height)
        if !deleteOnDragRelease {
            // if the item is not being deleted, snap back to the original location
            UIView.animateWithDuration(0.2, animations: {self.frame = originalFrame})
        }
    }
}
override func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {
    if let panGestureRecognizer = gestureRecognizer as? UIPanGestureRecognizer {
        let translation = panGestureRecognizer.translationInView(superview!)
        if fabs(translation.x) > fabs(translation.y) {
            return true
        }
        return false
    }
    return false
}

}

Может ли кто-нибудь узнать, что я делаю неправильно? Ячейки в таблице загружаются отлично, но их просто нельзя прокручивать, как будто я ничего не добавлял. Любая помощь или подсказки приветствуются


person cyril    schedule 20.05.2015    source источник
comment
Попробуйте установить userInteractionEnabled = true в методе инициализации ячейки   -  person Zell B.    schedule 20.05.2015
comment
Не сработало :( И с ячейками уже можно взаимодействовать, так как я могу щелкнуть по ним, и они подсвечиваются @zellb   -  person cyril    schedule 20.05.2015
comment
Вы должны установить метод tableView:canEditRowAtIndexPath, чтобы разрешить удаление смахиванием: developer.apple.com/library/ios/documentation/UIKit/Reference/:   -  person Dejan Skledar    schedule 20.05.2015
comment
Не думайте, что это так, поскольку в документах говорится: если этот метод не реализован, предполагается, что все строки доступны для редактирования. @DejanSkledar   -  person cyril    schedule 20.05.2015
comment
Можете ли вы проверить, вызывается ли его жестgestRecognizerShouldBegin?   -  person Zell B.    schedule 20.05.2015
comment
@zellb не вызывается ниgestRecognizerShouldBegin, ни handlePlan. Я предполагаю, что мои ячейки не являются пользовательскими ячейками? Это не имеет смысла, поскольку в tableview: cellForRowAtIndexPath: объявлено следующее: let cell = self.tableView.dequeueReusableCellWithIdentifier(regularCell, forIndexPath: indexPath) as! TimelineTableViewCell   -  person cyril    schedule 20.05.2015
comment
переопределить метод распознавания жестов shouldRecognizeSimultaneousWithGestureRecognizer, чтобы вернуть значение true, и проверить результаты, пожалуйста   -  person Zell B.    schedule 20.05.2015
comment
@zellb вообще никакого эффекта. Спасибо за помощь, хотя, это поставило меня в тупик уже более часа   -  person cyril    schedule 20.05.2015
comment
Это выглядит очень странно, позвольте мне продолжить расследование   -  person Zell B.    schedule 20.05.2015
comment
Почему бы просто не использовать методы по умолчанию для распознавания свайпа?   -  person mginn    schedule 20.05.2015
comment
@zellb смотрите решение ниже ????   -  person cyril    schedule 20.05.2015


Ответы (1)


Наконец-то разобрался! При добавлении распознавателя жестов сделайте это в awakeFromNib. Вот рабочий код:

override func awakeFromNib() {
        super.awakeFromNib()

        var panGestureRecognizer = UIPanGestureRecognizer(target: self, action: "handlePan:")
        panGestureRecognizer.delegate = self
        addGestureRecognizer(panGestureRecognizer)

    }
    func handlePan(recognizer: UIPanGestureRecognizer) {
        // 1
        if recognizer.state == .Began {
            // when the gesture begins, record the current center location
            originalCenter = center
        }
        // 2
        if recognizer.state == .Changed {
            let translation = recognizer.translationInView(self)
            center = CGPointMake(originalCenter.x + translation.x, originalCenter.y)
            // has the user dragged the item far enough to initiate a delete/complete?
            deleteOnDragRelease = frame.origin.x < -frame.size.width / 2.0
        }
        // 3
        if recognizer.state == .Ended {
            // the frame this cell had before user dragged it
            let originalFrame = CGRect(x: 0, y: frame.origin.y,
                width: bounds.size.width, height: bounds.size.height)
            if !deleteOnDragRelease {
                // if the item is not being deleted, snap back to the original location
                UIView.animateWithDuration(0.2, animations: {self.frame = originalFrame})
            }
        }
    }
    override func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {
        if let panGestureRecognizer = gestureRecognizer as? UIPanGestureRecognizer {
            let translation = panGestureRecognizer.translationInView(superview!)
            if fabs(translation.x) > fabs(translation.y) {
                return true
            }
            return false
        }
        return false
    }

Не беспокойтесь о переопределении init. Другим альтернативным решением, предложенным другом, было бы добавление прокрутки в представление содержимого ячейки и работа оттуда. Надеюсь это поможет! И спасибо всем, кто помог!

person cyril    schedule 20.05.2015