2016-09-20 2 views
0

그룹별로 많은 데이터를 표시해야하는 앱이 있습니다. 나는 테이블의 코너 뷰에 그룹 선택 메뉴를 두어 사용자가 볼 그룹을 선택할 수있게했다.코코아 nstableview 동적 바인딩 - IB없이

이 테이블의 열은 식별자 fld # 0..n과 데이터를 가져 오는 관련 컨트롤러가 있습니다. 대상 클래스에서, 뷰 컨트롤러에 바인딩 된 IBOutlet을 사용하여 그룹 선택을 검색하고 스위치를 통해 표시 할 값을 선택하는 데 사용합니다.

나는 여러 개의보기/창 인스턴스를 지원해야 할 때까지 모두 멋쟁이였다. 그래서 나는 실행 시간에 변경할 생각을하고 있었습니까? tablecolumn (s) 및 그 바인딩에. 지금까지 나는 IB를 통해 이러한 일을 한 적이 있었기 때문에 이것이 내게 처음으로 입술에 걸려 들러 붙어있었습니다.

- (NSMenu *)menuForEvent:(NSEvent *)event 
{ 
    NSMenu * menu = [[[NSMenu alloc] init] autorelease]; 
    SEL action = @selector(cornerAction:); 
    NSMenuItem * item = nil; 
    int type = 0; 

    // We auto enable items as views present them 
    [menu setAutoenablesItems:YES]; 

    // TableView level column customizations 
    for (NSString * title in titles) 
    { 
     BOOL state = dataView.data == type; 

     item = [[NSMenuItem alloc] initWithTitle:title 
              action:action 
            keyEquivalent:@""]; 
     [item setRepresentedObject:dataView]; 
     [item setState:state]; 
     [item setEnabled:YES]; 
     [item setTag:type++]; 
     [item setTarget:dataView]; 
     [item setAction:action]; 
     [menu addItem:item]; 
     [item release]; 
    } 
    return menu; 
} 

다음에 행동 -하지만 난 바인딩 업데이트하는 방법을 알아 내기 위해 필요로하는 실패 :

내 코너보기 작업 메뉴 (어떤 사용자가 호출)

- (IBAction)cornerAction:(id)sender 
{ 
    // Configure which type of data to show, then columns' identifier and sort 
    self.data = (self == sender ? 0 : [sender tag]); 

    [super cornerAction:sender]; 

    for (NSUInteger itm=0; itm<self.fieldCount; itm++) 
    { 
     NSString * fld = [NSString stringWithFormat:@"fld%@%d", titles[data], itm]; 
     NSString * key = [NSString stringWithFormat:@"srt%@%d", titles[data], itm]; 
     NSSortDescriptor * srt = [NSSortDescriptor sortDescriptorWithKey:key ascending:YES]; 

     [cols[itm] setIdentifier:fld]; 
     [cols[itm] setSortDescriptorPrototype:srt]; 

     [cols[itm] bind:<#(nonnull NSString *)#> 
       toObject:<#(nonnull id)#> 
      withKeyPath:<#(nonnull NSString *)#> 
       options:<#(nullable NSDictionary<NSString *,id> *)#>] 
    } 

    [self reloadArray:YES]; 
} 

COLS을 ]는 테이블 열의 배열이므로 마지막 행은 열에 대한 바인딩을 컨트롤러 (트리 컨트롤러)에 올바른 데이터로 업데이트하는 시작점입니다. 나는 fld # placesholder 칼럼을 제거하기 위해 클래스를 업데이트하고 fld #와 srt # ivars의 모든 변형을 생성했다. 이들은 기본적으로 기본 ivar을 반환합니다. 마지막으로 모든 액세스는 읽기 전용입니다.

내가 지금해야 할 일은 바인딩을 업데이트하는 것입니다. 또한 식별자와 정렬 설명 자의 열 변경이 필요하지 않을 수도 있습니다.

어쨌든 나는 그룹별로 테이블 뷰를 인스턴스화하는 계획 - B를 피하려고 노력하고 있습니다 - 퍽, 또는 아마도 더 좋은 방법이 있을까요?

UPDATE : I 플랜-A를 따라 계속 추정하여이 작업하지 않아야 COLS 대한 추정 컬럼 식별자 [0] 인해 내재 캐싱

 [cols[itm] bind: @"value" 
       toObject: treeController 
      withKeyPath: [NSString stringWithFormat:@"arrangedObjects.%@",fld] 
       options: nil] 
+0

테이블 뷰 뷰 기반 또는 셀 기반입니까? – Willeke

+1

일반적으로 컨트롤러에 바인딩 된 테이블이 있고 테이블에 표시된 내용을 변경하려는 경우 컨트롤러의 내용을 변경합니다. 뷰의 바인딩을 무너 뜨리지는 않습니다. 다른 데이터 세트를 바인드하여 다르게 표시하려는 경우 재구성 된 바인딩이있는 동일한보기가 아닌 다른보기를 동적으로 표시하여 해당 데이터 세트에 접근 할 수 있습니다. – stevesliva

+0

그래, 그걸 오믈렛에 달걀을 다시 스크램블하는 것이므로 몇 가지 탭 중 탭이 달린보기 (탭 덜 사용)를 사용해보십시오. – slashlos

답변

0

fld0이다/간단한 해결책을 복제 객체가 인스턴스화이었다 테이블보기. UI는 일관성있게 유지되어 사용자가 볼 수있는 변경 사항이 없으며 다른 유사한 요구 사항에 대한 모델이되었습니다. 단일 렌즈/테이블 뷰 메타포를 통해 방대한 양의 데이터를 보는 방법입니다.

관련 문제