Можливість проведення пальцем по стільниковій таблиці в iOS 9


83

Я хочу, щоб у моєму списку таблиць було меню, яке можна гортати, як у iOS 8 (вперше представлене в iOS 7).

Знімок екрана кнопок дії комірки для перегляду таблиці

Я знайшов керівництво Рея Вендерліха, в якому ясно, як це зробити, але воно було написане рік і 4 місяці тому, а код наведено в Objective-C.

Чи iOS 8 чи майбутній iOS 9 нарешті включили цю функцію в SDK Apple? Я знаю, що вони зробили вказівку, щоб розкрити функцію видалення, вбудовану багато років тому. Я не хочу витрачати свій час на впровадження з’єднаного коду для імітації функції пошти iOS 8, якщо новий iOS від Apple передасть його мені в акуратно упакованому пакеті.



2
Хтось знайшов рішення для проведення пальцем зліва направо в Swift? Справа наліво здається добре задокументованою та обговореною, але не зліва направо.
Atticus

Відповіді:


159

Спробуйте це. (Оновлено для Swift 3.0) ( Документи розробника )

override func tableView(_ tableView: UITableView, editActionsForRowAt: IndexPath) -> [UITableViewRowAction]? {
    let more = UITableViewRowAction(style: .normal, title: "More") { action, index in
        print("more button tapped")
    }
    more.backgroundColor = .lightGray

    let favorite = UITableViewRowAction(style: .normal, title: "Favorite") { action, index in
        print("favorite button tapped")
    }
    favorite.backgroundColor = .orange

    let share = UITableViewRowAction(style: .normal, title: "Share") { action, index in
        print("share button tapped")
    }
    share.backgroundColor = .blue

    return [share, favorite, more]
}

Також реалізуйте це: (Ви можете зробити це умовно, але тут все можна редагувати)

override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    return true
}

(Старіша версія)

func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
        let more = UITableViewRowAction(style: .Normal, title: "More") { action, index in
            print("more button tapped")
        }
        more.backgroundColor = UIColor.lightGrayColor()

        let favorite = UITableViewRowAction(style: .Normal, title: "Favorite") { action, index in
            print("favorite button tapped")
        }
        favorite.backgroundColor = UIColor.orangeColor()

        let share = UITableViewRowAction(style: .Normal, title: "Share") { action, index in
            print("share button tapped")
        }
        share.backgroundColor = UIColor.blueColor()

        return [share, favorite, more]
    }

    func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        // the cells you would like the actions to appear needs to be editable
        return true
    }

11
Це не відповідає на запитання. Ми намагаємося знайти вихід ліворуч, проведіть за допомогою swift Це не робить цього
Сому

Дякую! Це, очевидно, не впоралося з пальцем вліво-вправо, але я вирішив у будь-якому випадку відмовитися від цієї функції. Єдине, що незрозуміло, - як змусити таблицю автоматично оновлюватись після натискання кнопки, яка може перемістити / видалити комірку з таблиці?
Dave G

1
Не знаю, чи маєте ви на увазі tableview.reloadRowsAtIndexPaths ([indexpath] withRowAnimation: UITableViewRowAnimation.Automatic)і для видаленняtableview.deleteRowsAtIndexPaths([indexpath], withRowAnimation: UITableViewRowAnimation.Automatic)
jose920405

2
Чи можна відкрити дію редагування, натиснувши клітинку, замість того, щоб проводити її?
Heysem Katibi

1
Визначення функції Swift 3override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]?
Девід Корбін

28

Цей код працює для мене в swift4.

введіть тут опис зображення

Відповідь на наведеному вище екрані:

 func tableView(_ tableView: UITableView,
                   trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
    {
        // Write action code for the trash
        let TrashAction = UIContextualAction(style: .normal, title:  "Trash", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
            print("Update action ...")
            success(true)
        })
        TrashAction.backgroundColor = .red

        // Write action code for the Flag
        let FlagAction = UIContextualAction(style: .normal, title:  "Flag", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
            print("Update action ...")
            success(true)
        })
        FlagAction.backgroundColor = .orange

        // Write action code for the More
        let MoreAction = UIContextualAction(style: .normal, title:  "More", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
            print("Update action ...")
            success(true)
        })
        MoreAction.backgroundColor = .gray


        return UISwipeActionsConfiguration(actions: [TrashAction,FlagAction,MoreAction])
    }

введіть тут опис зображення

Відповідь на наведеному вище екрані: -

 func tableView(_ tableView: UITableView,
                   leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
    {

        let closeAction = UIContextualAction(style: .normal, title:  "Mark as Read", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
            print("CloseAction ...")
            success(true)
        })
        closeAction.backgroundColor = .blue
        return UISwipeActionsConfiguration(actions: [closeAction])

    }

Написати метод делегування таблиці аналогічним чином: -

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return arrPerson.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        let personName = arrPerson[indexPath.row]
        cell.textLabel?.text = personName.personName
        return cell

    }

І в viewDidLoad

override func viewDidLoad() {
    super.viewDidLoad()

    tblView.delegate = self
    tblView.dataSource = self

    let person1 = personData(personName: "Jonny", personAge: 30)
    let person2 = personData(personName: "Chandan", personAge: 20)
    let person3 = personData(personName: "Gopal", personAge: 28)

   arrPerson.append(person1)
   arrPerson.append(person2)
   arrPerson.append(person3)

}

7
Взяв лише 3 роки :) Дякую за відповідь
Рон Сребро

2
Це для iOS 11+
cdub

21

Ви можете використовувати метод делегування UITableView, щоб вимагати цих дій. Реалізуйте цей метод наступним чином:

- (NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
     UITableViewRowAction *modifyAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Modify" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {
         // Respond to the action.
     }];
     modifyAction.backgroundColor = [UIColor blueColor];
     return @[modifyAction];
}

Звичайно, ви можете повернути декілька дій та налаштувати колір тексту та фону.

Реалізація цього методу також потрібна для редагування рядка:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
}

Я можу отримати всю цю функціональність лише з десяток рядків коду? Або ви просто хочете вставити будь-який код, який я в кінцевому підсумку використовую, у цю функцію. Жоден із заданого коду навіть не виглядає так, ніби він змінює комірку. Крім того, намагаючись вирішити це в Swift.
Dave G

Так, ви можете отримати всі функції лише за допомогою цього коду. Це вбудована функція. Ого, це навіть правильна відповідь, і хтось проти проголосував за неї. Я здивований.
BalestraPatrick

Майте на увазі, що це доступно, оскільки iOS8 +, і ТІЛЬКИ дозволяє вам проводити пальцем ліворуч, вам потрібно виконати власну реалізацію, щоб провести пальцем праворуч. Окрім цього, швидка та проста відповідь
Jiri Trecak

Дякуємо, що поділилися нею. Якщо я занадто некомпетентний, щоб реалізувати повне меню, я можу скористатися цим більш простим рішенням. Я проголосував за нього, оскільки він є актуальним, але я не можу вибрати його як відповідь, оскільки він не відповідає на питання про те, як імітувати повне меню Пошти iOS8, плюс це написано в цель-С.
Dave G

15

Я знайшов цю бібліотеку MGSwipeTableCell Після того, як я багато шукав, щоб реалізувати клітинку слайда в поданні таблиці за допомогою swift, я знайшов цю та її лише один рядок коду для здійснення та знайшов її надзвичайно корисною.

     func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
  {
    let reuseIdentifier = "programmaticCell"
    var cell = self.table.dequeueReusableCellWithIdentifier(reuseIdentifier) as! MGSwipeTableCell!
    if cell == nil
    {
      cell = MGSwipeTableCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: reuseIdentifier)
    }

    cell.textLabel!.text = "Title"
    cell.detailTextLabel!.text = "Detail text"
    cell.delegate = self //optional

    //configure left buttons
    cell.leftButtons = [MGSwipeButton(title: "", icon: UIImage(named:"check.png"), backgroundColor: UIColor.greenColor())
      ,MGSwipeButton(title: "", icon: UIImage(named:"fav.png"), backgroundColor: UIColor.blueColor())]
    cell.leftSwipeSettings.transition = MGSwipeTransition.Rotate3D

    //configure right buttons
    cell.rightButtons = [MGSwipeButton(title: "Delete", backgroundColor: UIColor.redColor())
      ,MGSwipeButton(title: "More",backgroundColor: UIColor.lightGrayColor())]
    cell.rightSwipeSettings.transition = MGSwipeTransition.Rotate3D

    return cell
  }

Це єдина функція, яка вам доведеться реалізувати та оновити ваш файл pod


11

Повне рішення Swift 3:

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        tableView.tableFooterView = UIView(frame: CGRect.zero) //Hiding blank cells.
        tableView.separatorInset = UIEdgeInsets.zero
        tableView.dataSource = self
        tableView.delegate = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return 4
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "tableCell", for: indexPath)

        return cell
    }

    //Enable cell editing methods.
    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {

        return true
    }

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

    }

    func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {

        let more = UITableViewRowAction(style: .normal, title: "More") { action, index in
            //self.isEditing = false
            print("more button tapped")
        }
        more.backgroundColor = UIColor.lightGray

        let favorite = UITableViewRowAction(style: .normal, title: "Favorite") { action, index in
            //self.isEditing = false
            print("favorite button tapped")
        }
        favorite.backgroundColor = UIColor.orange

        let share = UITableViewRowAction(style: .normal, title: "Share") { action, index in
            //self.isEditing = false
            print("share button tapped")
        }
        share.backgroundColor = UIColor.blue

        return [share, favorite, more]
    }

}

2

AFAIK не має вбудованого готового рішення, і навіть якщо воно було в iOS9, ви, ймовірно, не можете використовувати його, оскільки ви не можете підтримувати iOS9 у своєму додатку в найближчому майбутньому.

Натомість рекомендую заглянути в цю бібліотеку:

https://github.com/CEWendel/SWTableViewCell

Це дуже легко налаштовується, досить полірується і добре працює в будь-якому стрімкому проекті, над яким я працював.

Сподіваюся, це допоможе!


Дякую. Нове у розробці та ніколи раніше не використовувало GitHub. Я просто завантажив zip-файл і відкрив проект у X-Code, а потім запустив проект, але отримав "Помилка збірки". Чи потрібно мені об’єднувати код у свій проект, перш ніж я зможу побачити, як він працює?
Dave G

Вам краще встановити Cocoapods як менеджера залежностей; Це галузевий стандарт і врятує вас НАБАГАТО головного болю. Більше про кокаподи і як ними користуватися тут cocoapods.org
Іржі Тречак

Дякую Іржі, коротко прочитавши про CocoaPods, здається, мені доведеться далі читати сьогодні, щоб зрозуміти їх. Я захопився і замість запуску проекту github я просто почав розглядати код. Це в об’єктиві-С! Мій додаток працює на Swift, і це мова, якою я знайомий. Чи потрібно мені перекладати рішення github у Swift, або, оскільки їх можна запускати поруч, чи зможу я скопіювати код Objective-C ViewController у мій BasicCellViewController?
Dave G

З cocoapods ви запускаєте бібліотеки поруч, ціль C і швидко, якщо ви використовуєте iOS8 +. Тоді ви можете безперешкодно використовувати код Obj-C у своєму швидкому проекті (але він буде прихований під проектом "pods"), єдине, що вам потрібно зробити, це імпортувати бібліотеку cilj-c у ваш "Bridging Header" developer.apple.com / library / prerelease / ios / documentation / Swift /…
Іржі Тречак

Просто прочитайте про CocoaPods ( raywenderlich.com/97014/use-cocoapods-with-swift ), я думаю, це буде занадто багато для мого мозку, щоб жувати. Я отримую концепцію, але реалізую її в терміналі, використовую робочі простори, а додаток запускається за кодом, не об’єднаним з іншим моїм кодом ... плюс налаштування фактичної функції меню, щоб виглядати / діяти так, як я цього хочу ... мій мозок би вибухнути. Збираючись вивчити, як я просто вставлю цей файл obj-c і скажу своєму додатку, що я використовую обидві мови. Раніше цього не робив, але здається простішим
Дейв Г

1

Це простіше, ніж ви думаєте. Ось приклад класу Swift із реалізованим UITableView та можливістю гортати UITableViewCell.

import UIKit

class ViewController: UIViewController {

    // MARK: Properties

    let strings = ["firstString", "secondString", "thirdString"]

    // MARK: Outlets

    @IBOutlet weak var tableView: UITableView!

    // MARK: Lifecycle

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self
    }
}

extension ViewController: UITableViewDataSource, UITableViewDelegate {

    // MARK: UITableViewDataSource

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return objects.count
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cellIdentifier", for: indexPath)
        let currentString = strings[indexPath.row]
        cell.textLabel?.text = currentString
        return cell
    }

    // MARK: UITableViewDelegate

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
    }

    func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
        let leftAction = UIContextualAction(style: .normal, title:  "Red", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
            print("leftAction tapped")
            success(true)
        })

        leftAction.image = UIImage(named: "")
        leftAction.backgroundColor = UIColor.red

        return UISwipeActionsConfiguration(actions: [leftAction])
    }

    func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
        let rightAction = UIContextualAction(style: .normal, title:  "Green", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
            print("rightAction tapped")
            success(true)
        })

        rightAction.image = UIImage(named: "")
        rightAction.backgroundColor = UIColor.green

        return UISwipeActionsConfiguration(actions: [rightAction])
    }

}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.