iOS 9에서 스 와이프 가능한 표보기 셀


83

내 테이블 목록에 iOS 8 (iOS 7에서 처음 도입 됨)과 같이 스 와이프 할 수있는 메뉴가 있어야합니다.

테이블보기 셀 작업 버튼의 스크린 샷

방법에 대한 명확한 Ray Wenderlich 가이드를 찾았 지만 1 년 4 개월 전에 작성되었으며 코드는 Objective-C에 있습니다.

iOS 8 또는 곧 출시 될 iOS 9가 마침내이 기능을 Apple의 SDK에 포함 시켰습니까? 몇 년 전에 "스 와이프하여 삭제 기능 표시"를 내장 한 것으로 알고 있습니다. Apple의 새로운 iOS가 깔끔하게 포장 된 패키지로 나에게 전달한다면 iOS 8 메일 기능을 모방하기 위해 함께 패치 된 코드를 구현하는 데 시간을 낭비하고 싶지 않습니다.



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를 사용하여 왼쪽으로 스 와이프하는 방법을 찾으려고합니다. 이것은 그렇게하지 않습니다
Somu

감사! 이것은 분명히 좌우 스 와이프를 처리하지 않았지만 어쨌든 그 기능을 포기하기로 결정했습니다. 명확하지 않은 유일한 것은 테이블에서 셀을 이동 / 삭제할 수있는 버튼을 누른 후 테이블을 자동으로 새로 고치는 방법입니다.
Dave G

1
무슨 뜻 알고하지 마십시오 tableview.reloadRowsAtIndexPaths ([indexpath] withRowAnimation: UITableViewRowAnimation.Automatic)및 삭제를위한tableview.deleteRowsAtIndexPaths([indexpath], withRowAnimation: UITableViewRowAnimation.Automatic)
jose920405

2
셀을 스 와이프하는 대신 탭하여 작업 편집을 열 수 있습니까?
Heysem Katibi

1
스위프트 3 함수 정의override 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])

    }

다음과 같이 tableview Delegate 메소드를 작성하십시오.

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
대답 만 삼년 : 감사 툭
론 Srebro을

2
그것은 아이폰 OS 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 {
}

12 줄의 코드만으로 모든 기능을 얻을 수 있습니까? 또는 내가 사용하는 코드를 그 함수에 삽입하라고 말하는 것입니다. 주어진 코드는 셀을 수정하는 것처럼 보이지도 않습니다. 또한 Swift에서이 문제를 해결하려고합니다.
Dave G

예, 해당 코드만으로 모든 기능을 얻을 수 있습니다. 기본 제공 기능입니다. 와우, 이것은 정답이며 누군가가 투표했습니다. 놀랐어요.
BalestraPatrick

이 기능은 iOS8 이상부터 사용할 수 있으며 왼쪽으로 스 와이프 만 할 수 있으며 오른쪽으로 스 와이프하려면 사용자 정의 구현을 만들어야합니다. 그 외에 빠르고 쉬운 답변도 가능합니다
Jiri Trecak 2015-08-14

공유 해주셔서 감사합니다. 전체 메뉴를 구현하기에는 너무 무능하다면이 간단한 솔루션을 사용할 수 있습니다. 관련성이 있기 때문에 찬성 투표를했지만 전체 iOS8 메일 메뉴를 모방하는 방법에 대한 질문에 답하지 않고 목표 -C로 작성되어 있기 때문에 답으로 선택할 수 없습니다.
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
  }

그것이 당신의 포드 파일을 구현하고 업데이트해야 할 유일한 기능입니다.


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에서 프로젝트를 연 다음 프로젝트를 실행했지만 "Build Failed"가 발생했습니다. 어떻게 작동하는지보기 전에 코드를 프로젝트에 병합해야합니까?
Dave G

Cocoapods를 종속성 관리자로 설치하는 것이 좋습니다. 그것은 업계 표준이며 많은 두통을 덜어 줄 것입니다. 더 cocoapods aboout 어떻게 여기에 그것을 사용하는 cocoapods.org
지리산 Trecak

Jiri에게 감사합니다. CocoaPods에 대해 간략히 읽은 후 오늘 밤 더 읽어야 할 것 같습니다. 나는 열망했고 github 프로젝트를 실행하는 대신 코드를보기 시작했습니다. Objective-C에 있습니다! 내 앱은 Swift에 있으며 내가 익숙한 언어입니다. github 솔루션을 Swift로 번역해야합니까? 아니면 나란히 실행할 수 있기 때문에 Objective-C ViewController 코드를 BasicCellViewController에 복사 할 수 있습니까?
Dave G

cocoapods를 사용하면 iOS8 이상을 사용하는 경우 라이브러리를 나란히, 목표 C 및 신속하게 실행합니다. 그런 다음 신속한 프로젝트에서 Obj-C 코드를 원활하게 사용할 수 있습니다 (그러나 "pods"프로젝트 아래에 숨겨 짐). "브리징 헤더" developer.apple.com
지리산 Trecak

CocoaPods ( raywenderlich.com/97014/use-cocoapods-with-swift ) 에 대해 읽어 보면 내 두뇌가 씹기에는 너무 많은 것 같습니다. 나는 개념을 얻었지만 터미널에서 구현하고, 작업 공간을 사용하고, 내 앱이 다른 코드와 병합되지 않은 코드에서 실행되도록 ... 또한 실제 메뉴 기능을 조정하여 내가 원하는 방식으로 보거나 행동합니다. 터지다. 그 obj-c를 어떻게 붙여넣고 두 언어를 모두 사용하고 있는지 앱에 알리는 방법을 살펴 보겠습니다. 이전 것을 수행하지만 간단 보인다되지 않은
데이브 G에게

1

생각보다 쉽습니다. 다음은 구현 된 UITableView 및 UITableViewCell 스 와이프 기능이있는 Swift 클래스의 예입니다.

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])
    }

}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.