2017-05-01 1 views
0

오른쪽에서 왼쪽으로 스 와이프 할 때 이미 두 개의 사용자 정의 버튼 (UITableViewRowAction 편집 작업)을 구현하는 셀이있는 UITableView가 있습니다. 모든 것이 잘 작동합니다.UITableViewCell 오른쪽에서 왼쪽으로 스 와이프 할 때

Mail.app와 비슷한 방식으로 사용자가 "모든 방법"(오른쪽에서 왼쪽으로)을 쓸 때 버튼 동작 중 하나를 트리거하고 싶습니다. 나는 장소에 충분한 코드를 생각하는 무슨이

아이폰 OS 9 및 10

코드, 스위프트 3입니다.

func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle { 
    return .delete 
} 

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

commit editingStyle 기능은 내가가 기대하는 것처럼, 화재하지 않습니다.

editActionsForRowAt 메서드를 제거했는데, 사용자 지정 단추를 정의하는 동안 뭔가를 망쳐 놓고 있다고 생각했습니다. 이제 기본 "삭제"버튼이 표시되지만 commit editingStyle은 여전히 ​​실행되지 않습니다.

이것이 가치있는 일인데, 이것은 UITableViewController (UITableViewController 아님) 내부의 UITableView이며 .dataSource와 .delegate가 모두 해당 클래스로 설정되어 있습니다. 또한 NSFetchedResultsControllerDelegate입니다.

+0

Master/Detail 템플릿 프로젝트 (Xcode 8.3.2)조차도 이러한 방법을 사용할 수 있으며 풀 스 와이프를 지원하지 않습니다. 필자가 읽고있는 내용은 오른쪽에서 왼쪽으로 완전 스와핑이 내장되어 있음을 암시하는 것은 부정확합니다. –

답변

0

UISwipeGestureRecognizer을 개별 셀이 아닌 테이블 자체에 연결하십시오. 스 와이프가 감지되면 스 와이프 한 셀을 계산하고 이에 따라 스 와이프 작업을 호출합니다.

+0

나는 그것에 대해 생각했지만 차라리 피할 수있는 해킹 같은 느낌이 든다. 나는'commit editingStyle'이이 목적을 위해 존재한다고 믿습니다. 그래서 나는 그것을 얻고 싶습니다. –

0

이 추가 :

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

이미 제 자리에 있습니다. 원래의 질문에 그 부분을 포함해야했습니다. 이 함수는 예상대로 호출되고 있습니다. 한 번의 스 와이프로 3 번 호출됩니다. 무엇이든지 가치가 있습니다. –

0

은 내가 해킹의 너무 많은 생각하지 않습니다이 할 수있는 메커니즘을 함께했다 - 확실히 덜 그래서 내가 찾은 다른 솔루션보다. 의견 환영합니다.

가능한 한 많은 표준 기능을 항상 사용하고자합니다. 내가하고있는 일은 사용자가 셀 본문을 왼쪽으로 얼마나 멀리 스윕했는지 추적하는 것입니다. 어떤 임계 값에 도달하면 UITableView는 해당 버튼에 대해 editActionsForRowAt에서 호출 된 것과 동일한 작업을 수행하도록 지시합니다.

저는 셀이 왼쪽으로 얼마나 멀리 이동했는지 임계 값으로 -225를 사용하고 있습니다. 이것은 모든 구현에서 작동하지 않을 수도 있습니다 (그리고 나는 더 많은 테스트를 통해 자신을 수정할 수 있습니다). 제 경우에는 두 개의 사용자 정의 액션이 있습니다. 하나의 버튼은 다소 넓은면에 있습니다.

내가 실제로 추가하는 유일한 것은 .UITrackingRunLoopMode를 사용하여 기본 실행 루프에 추가하는 NSTimer입니다. 이것은 사용자가 손가락을 움직일 때 (그리고 오직 때에 만) 움직이는 이점이 있습니다. 타이머가 작동하면 셀이 tableView에 상대적인지를 확인합니다. 추가 된 뷰가없고 제스처 인식기가 추가되지 않았습니다.사용자 지정있는 UITableViewCell에서

, 나는이 추가 : jQuery과의 cellForRowAtIndexPath에서

var trackTimer:Timer? = nil 
weak var tableView:StudentsLessonsViewController? = nil 

override func awakeFromNib() { 
    super.awakeFromNib() 
    setupTimer() 
} 

override func prepareForReuse() { 
    super.prepareForReuse() 
    setupTimer() 
} 

func setupTimer() { 
    self.trackTimer = Timer.init(timeInterval: 0.1, target: self, selector: #selector(performActionIfScrolledFarEnough), userInfo: nil, repeats: true) 
    if let trackTimer = self.trackTimer { 
     RunLoop.main.add(trackTimer, forMode: .UITrackingRunLoopMode) 
    } 
} 

func performActionIfScrolledFarEnough() { 
    let globalPoint = self.superview?.convert(self.frame.origin, to: self.tableView?.tableView) 
    //print("globalPoint.x: \(String(describing: globalPoint?.x))") 
    if let globalPoint = globalPoint { 
     if globalPoint.x < CGFloat(-225) { 
      //print ("Perform Action NOW!!!") 
      trackTimer?.invalidate() 
      if let tableView = self.tableView { 
       tableView.primaryActionButtonPressed(cell: self) 
      } 
     } 
    } 
} 

을, 나는 추가 :

cell?.tableView = self 

나는 이미 내가 때를 호출 한 내 jQuery과이 기능을했다 사용자는 editActionsForRowAt에 정의 된 버튼 중 하나를 탭합니다.

func tableView.primaryActionButtonPressed(cell:UITableViewCell) 

내 primaryActionButtonPressed 함수 나는 개념적으로 삭제와 같은 tableView에서 셀을 제거합니다. 유사하지 않은 동작에는 구현 세부 사항이 다를 수 있습니다.

관련 문제