문제

표시될 데이터를 기반으로 NSTableView의 일부 열을 동적으로 숨기거나 표시하고 싶습니다. 기본적으로 열이 비어 있으면 열을 숨기고 싶습니다.현재 테이블의 대리인으로 컨트롤러 클래스를 사용하여 테이블을 채우고 있습니다.

어떤 아이디어가 있나요?Interface Builder에서 숨겨진 열을 설정할 수 있다는 것을 알지만, 열을 살펴보고 비어 있는지 여부를 확인하기에는 좋은 시간이 아닌 것 같습니다. 테이블의 모든 데이터가 채워지기 전/후에 호출됩니다.

도움이 되었습니까?

해결책

NSTable은 테이블을 그리는 클래스일 뿐입니다.스스로 말했듯이 테이블에 대리인으로 제공하는 클래스가 있으며 이 클래스는 표시할 데이터를 테이블에 제공합니다.테이블 데이터를 위임 클래스 내에 NSArray로 저장하면 한 열이 비어 있는지 쉽게 알 수 있습니다. 그렇지 않습니까?그리고 NSArray는 대리자 메서드를 통해 클래스에 열이 몇 개 있는지 묻습니다. 따라서 질문을 받을 때 내부에 저장한 실제 열 수 대신 데이터가 있는 열 수를 찾아보고 요청을 받을 때 해당 숫자를 보고하는 것이 좋습니다. (열, 행)에 대한 데이터를 제공할 때 빈 열을 건너뛰면 됩니다.

다른 팁

Mac OS X v10.5 이상에는 setHidden: 선택자 NSTableColumn의 경우.

이를 통해 식별자를 사용하여 열을 동적으로 숨기거나 표시할 수 있습니다.

NSInteger colIdx;
NSTableColumn* col;

colIdx = [myTable columnWithIdentifier:@"columnIdent"];
col = [myTable.tableColumns objectAtIndex:colIdx];
[col setHidden:YES];

바인딩을 사용하여 이 작업을 수행했지만 인터페이스 빌더를 통하지 않고 프로그래밍 방식으로 설정했습니다.

이 유사 스니펫을 통해 요점을 알 수 있습니다.

NSTableColumn *aColumn = [[NSTableColumn alloc] initWithIdentifier:attr];
[aColumn setWidth:DEFAULTCOLWIDTH];
[aColumn setMinWidth:MINCOLWIDTH];
[[aColumn headerCell] setStringValue:columnLabel];

[aColumn bind:@"value"
     toObject:arrayController 
  withKeyPath:keyPath 
  options:nil];             

[tableView addTableColumn:aColumn];
[aColumn release];

물론 포맷터와 그 모든 항목도 추가할 수 있습니다.

인터페이스 빌더에서는 작동하지 않습니다.그러나 프로그래밍 방식으로 작동합니다.다음은 ID가 "Status"인 NSTableViewColumn을 NSUserDefaults의 키에 바인딩하는 방법입니다.

빠른:

tableView.tableColumnWithIdentifier("Status")?.bind("hidden", toObject: NSUserDefaults.standardUserDefaults(), withKeyPath: "TableColumnStatus", options: nil)

목표-C:

[[self.tableView tableColumnWithIdentifier:@"Status"] bind:@"hidden" toObject:[NSUserDefaults standardUserDefaults] withKeyPath:@"TableColumnStatus" options:nil];

현재로서는 완전한 답변이 없지만 바인딩을 살펴보세요.일반적으로 Cocoa Bindings를 사용하면 모든 종류의 작업을 수행할 수 있습니다.

NSTableColumn에 대한 가시성 바인딩은 없지만 너비를 0으로 설정할 수 있습니다.

그런 다음 이를 Null 자리 표시자에 바인딩하고 이 값을 0으로 설정할 수 있습니다. 하지만 다른 자리 표시자를 적절한 값으로 설정하는 것을 잊지 마십시오.

(내가 말했듯이 이것은 시작일 뿐이므로 약간의 조정이 필요할 수 있습니다.)

모든 데이터가 채워지는 시간은 없습니다.NSTableView는 데이터를 저장하지 않으며 데이터 소스(또는 바인딩을 사용하는 경우 바인딩된 개체)에서 동적으로 데이터를 요청합니다.단지 데이터 소스에서 얻은 데이터를 사용하여 그림을 그리고 버립니다.예를 들어 테이블이 표시되지 않는 항목에 대한 데이터를 요청하는 것을 볼 수 없습니다.

데이터 소스를 사용하고 있는 것 같나요?데이터가 변경되면 테이블에서 -reloadData를 호출하는 것은 사용자의 책임입니다. 이는 약간 잘못된 이름입니다.그것은 '모든 것을 무효화'하는 것과 같습니다.

즉, 데이터가 언제 변경되는지 이미 알고 있어야 합니다.이것이 숨겨져야 할 열을 계산할 수 있는 지점입니다.

@amrox - 귀하의 제안을 올바르게 이해하고 있다면 내 테이블에 있는 NSTableColumns의 숨겨진 속성에 값을 바인딩해야 한다는 뜻인가요?작동할 것 같지만 NSTableColumn에 숨겨진 속성이 있다고는 생각하지 않습니다. isHidden 및 setHidden 메시지가 열의 가시성을 제어하기 때문입니다. 이는 누락된 것이 없는 한 이것이 속성이 아니라는 것을 알려줍니다. (이것은 매우 가능합니다).

Cocoa 바인딩과 실제 바인딩을 사용하여 Swift 4용으로 업데이트된 솔루션을 게시하고 싶습니다. isHidden 열 너비를 건드리지 않고 플래그를 지정하세요(나중에 원래 값을 복원해야 할 수도 있으므로...).일부 열 표시 여부를 전환하는 확인란이 있다고 가정합니다(또는 언제든지 표시 여부를 전환할 수 있음). hideColumnsFlag 원하는 다른 방식으로 아래 예의 변수를 사용하세요):

class ViewController: NSViewController {

     // define the boolean binding variable to hide the columns and use its name as keypath
     @objc dynamic var hideColumnsFlag = true

     // Referring the column(s)
     // Method 1: creating IBOutlet(s) for the column(s): just ctrl-drag each column here to add it
     @IBOutlet weak var hideableTableColumn: NSTableColumn!
     // add as many column outlets as you need...

     // or, if you prefer working with columns' string keypaths
     // Method 2: use just the table view IBOutlet and its column identifiers (you **must** anyway set the latter identifiers manually via IB for each column)
     @IBOutlet weak var theTableView: NSTableView! // this line could be actually removed if using the first method on this example, but in a real case, you will probably need it anyway.

     // MARK: View Controller Lifecycle

     override func viewDidLoad() {
         super.viewDidLoad()

         // Method 1
         // referring the columns by using the outlets as such:
         hideableTableColumn.bind(.hidden, to: self, withKeyPath: "hideColumnsFlag", options: nil)
         // repeat for each column outlet.

         // Method 2
         // or if you need/prefer to use the column identifiers strings then:
         // theTableView.tableColumn(withIdentifier: .init("columnName"))?.bind(.hidden, to: self, withKeyPath: "hideColumnsFlag", options: nil)
         // repeat for each column identifier you have set.

         // obviously use just one method by commenting/uncommenting one or the other.
     }

     // MARK: Actions

     // this is the checkBox action method, just toggling the boolean variable bound to the columns in the viewDidLoad method.
     @IBAction func hideColumnsCheckboxAction(_ sender: NSButton) {
         hideColumnsFlag = sender.state == .on
     }
}

아시다시피 아직은 바인딩할 수 있는 방법이 없습니다. Hidden XCode10에서와 같이 인터페이스 빌더의 플래그:당신은 볼 수 있습니다 Enabled 또는 Editable 하지만 프로그래밍 방식으로만 액세스할 수 있습니다. isHidden Swift에서 호출되는 열에 대한 플래그입니다.

설명에서 언급한 대로 두 번째 방법은 관련 열을 선택한 후 ID 필드의 인터페이스 빌더를 통해 수동으로 설정해야 하는 열 식별자에 의존합니다. 또는 열 이름 배열이 있는 경우 테이블 열을 열거하고 할당할 수 있습니다. 유사한 코드 라인을 반복하는 대신 식별자와 바인딩을 사용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top