그룹별로 많은 데이터를 표시해야하는 앱이 있습니다. 나는 테이블의 코너 뷰에 그룹 선택 메뉴를 두어 사용자가 볼 그룹을 선택할 수있게했다.코코아 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]
테이블 뷰 뷰 기반 또는 셀 기반입니까? – Willeke
일반적으로 컨트롤러에 바인딩 된 테이블이 있고 테이블에 표시된 내용을 변경하려는 경우 컨트롤러의 내용을 변경합니다. 뷰의 바인딩을 무너 뜨리지는 않습니다. 다른 데이터 세트를 바인드하여 다르게 표시하려는 경우 재구성 된 바인딩이있는 동일한보기가 아닌 다른보기를 동적으로 표시하여 해당 데이터 세트에 접근 할 수 있습니다. – stevesliva
그래, 그걸 오믈렛에 달걀을 다시 스크램블하는 것이므로 몇 가지 탭 중 탭이 달린보기 (탭 덜 사용)를 사용해보십시오. – slashlos