2017-10-10 15 views
0

저는 macOS 용 스위프트 4로 작업 중이며 핵심 데이터에서 NSTableview로 데이터를 가져옵니다.코어 데이터에 행 번호 저장 및 내림차순으로 주문

이제 데이터 순서를 저장하고 싶습니다. 예 :

MyCoreData1 (Row 1) 
MyCoreData2 (Row 2) 
MyCoreData3 (Row 3) 
MyCoreData4 (Row 4) 

지금은 드래그를 정렬하고 다음과 같이 드롭 :

MyCoreData1 (Row 3) 
MyCoreData2 (Row 2) 
MyCoreData3 (Row 1) 
MyCoreData4 (Row 4) 

을 내가 핵심 데이터에 새로운 질서를 저장할 수 있습니까? 순간 나는 나의 실체

MyCoreData1 (sortNumber 10) 
MyCoreData2 (sortNumber 20) 
MyCoreData3 (sortNumber 30) 
MyCoreData4 (sortNumber 40) 

에 속성 "sortNumber"을하고 난 sortNumber "제품 설명" 하여 정렬합니다 그러나 나는 그것을 다시 정렬하는 경우, 나는 (내가 추측 복잡한을 구축해야 복잡한 것입니다.) 논리를 사용하여 각 요소의 sortNumber를 새 정렬 순서로 변경합니다.

어떻게 해결할 수 있습니까? 드래그에 대한

코드 행

func tableView(_ tableView: NSTableView, acceptDrop info: NSDraggingInfo, row: Int, dropOperation: NSTableView.DropOperation) -> Bool { 
     let pasteboard = info.draggingPasteboard() 
     let pasteboardData = pasteboard.data(forType: NSPasteboard.PasteboardType.string) 

     if let pasteboardData = pasteboardData { 

      if let rowIndexes = NSKeyedUnarchiver.unarchiveObject(with: pasteboardData) as? IndexSet { 
       var oldIndexOffset = 0 
       var newIndexOffset = 0 

       for oldIndex in rowIndexes { 

        if oldIndex < row { 
         tableView.moveRow(at: oldIndex + oldIndexOffset, to: row - 1) 
         oldIndexOffset -= 1 
        } else { 
         tableView.moveRow(at: oldIndex, to: row + newIndexOffset) 
         newIndexOffset += 1 
        } 
       } 
      } 
     } 

     return true 
    } 
+0

나는 혼란스러워. 이 코드는 ** UI ** (tableView.moveRow ...)를 업데이트하는 로직을 포함합니다 **. 따라서 데이터 소스 배열을 업데이트하고 설명한대로 레코드를 다시 인덱싱해야합니다. – vadian

+0

첫 번째 게시물을 새 코드로 업데이트했습니다. 이 코드를 사용하면 테이블 뷰를 다시로드하거나 데이터를 다시 가져 오지 않고 드래그 결과를 직접 볼 수 있습니다. 하지만 모르겠다. 어떻게 데이터 객체를 다시 색인 할 수 있을까? 이 상황에 맞는 올바른 코드입니까? – Ghost108

+0

특정 주문이 필요한 몇 가지 (핵심 데이터) 프로젝트에서 직접 사용하고 있습니다. – vadian

답변

0

당신이 코어 데이터의 속성으로 인덱스를 저장하기 위해 당신이 특정 순서를 유지해야합니다.

레코드를 다시 인덱싱하는 논리는 복잡하지 않습니다. 순서 변경 테이블 뷰 내의 위치에 따른 index 특성을 업데이트 및 예를 들면, 콘텍스트를 저장할 때마다 (items 가정하면 데이터 소스 어레이이고 NSManagedObject 서브 클래스는 속성 index 갖는다)는 페치

func reindex() 
{ 
    for (index, item) in items.enumerated() { 
     item.index = Int32(index) 
    } 
    saveContext() 
} 

을 데이터 정렬에 의해 레코드를 index

+0

어쩌면 나는 그것이 복잡하다고 생각하지만, : 내 핵심 데이터 "배열"은 NSManagedObject입니다. 각 수정 내용은 핵심 데이터에 직접 저장됩니다. 현재 요소를 다른 행으로 드래그하면 코어 데이터에 새 행 번호를 저장하고 다른 개체의 새 행 번호를 설정하고 코어 데이터의 데이터를 다시 가져 와서 테이블을 다시로드하십시오. – Ghost108

+0

필요하지 않습니다. 데이터를 다시 가져오고 테이블보기를 다시로드 할 필요가 없습니다. 인덱스 속성을 변경하고 컨텍스트를 저장하면됩니다. – vadian

+0

하지만 테이블보기를 다시로드하지 않으면 어떻게 새 주문이 적용됩니까? – Ghost108