nscollectionView의보기 서브 클래스에서 프로그래밍 방식으로 어떻게 결합합니까?

StackOverflow https://stackoverflow.com/questions/1210352

문제

NScollectionView를 성공적으로 만들고 IB의 View 프로토 타입에 레이블을 추가하여 대표적인 객체의 속성에 결합했습니다. 이제 Nstextfield가 내 대표 객체의 속성에 묶인 NSButton 및 Nstextfield를 프로그래밍 방식으로 만들고 싶습니다. 버튼을 클릭하면 Nstextfield를 표시하고 숨기고 싶습니다.

내가 겪은 문제는 뷰의 initwithCoder 메소드에 내 컨트롤에 대한 초기화 코드를 넣고 뷰의 awakefromnib에 바인딩이 연결되지 않는다는 것입니다. awakefromnib에서 컨트롤에 대한 초기화를 넣으면 버튼을 클릭하면 내 뷰에서 컨트롤에 액세스 할 수 없습니다 (NSLOG를 사용하여 인쇄 할 때는 NULL입니다).

내가 말할 수있는 것은 문제가 NscollectionView의 작동 방식이 작동하는 방식이 뷰의 인스턴스를 만듭니다. 그런 다음 모든 객체가 컬렉션 뷰의 방식에 대해 복사합니다. 버튼을 초기화하고 프로토 타입의 사본과 함께 작동하도록 바인딩하려면 어떻게해야합니까?

아래는 초기화 코드와 서브 클래스 뷰에 대한 Awakefromnib의 바인딩입니다.

subview.h

@interface SubView : NSView {
    NSButton *button;
    NSTextField *textField;
    IBOutlet NSCollectionViewItem *item; // Connected in IB to my NSCollectionViewItem
}

- (IBAction)buttonClicked:(id)sender;

@end

subview.m

@implementation SubView

- (id)initWithCoder:(NSCoder *)decoder
{
    id view = [super initWithCoder:decoder];

    button = [[NSButton alloc] initWithFrame:NSMakeRect(50, 95, 100, 20)];
    [button setTitle:@"Begin Editing"];
    [button setTarget:self];
    [button setAction:@selector(buttonClicked:)];
    [self addSubview:button];

    textField = [[NSTextField alloc] initWithFrame:NSMakeRect(10, 10, 100, 75)];
    [self addSubview:textField];

    return(view);
}

- (void)awakeFromNib
{   
        // Bind the textField to the representedObject's name property
        [textField bind:@"value" 
       toObject:item 
        withKeyPath:@"representedObject.name" 
        options:nil];
}

- (IBAction)buttonClicked:(id)sender
{
    [button setTitle:@"End Editing"];
    [textField setHidden:YES];
}

@end
도움이 되었습니까?

해결책

이것은 내가 방금 한 것과 비슷하게 들리므로 아마도 당신이 필요한 것일 수도 있습니다.

아강 nscollectionView 그리고 재정의 :

- (NSCollectionViewItem *)newItemForRepresentedObject:(id)object

~ 안에 newItemForRepresentedObject:, 뷰 항목을 리트레드 한 다음 컨트롤과 프로그래밍 방식의 바인딩을 추가하십시오.

@implementation NSCollectionViewSubclass

- (NSCollectionViewItem *)newItemForRepresentedObject:(id)object {

    // Allow the superclass to create or copy the collection view item
    NSSCollectionViewItem *newItem = [super newItemForRepresentedObject:object];

    // Get the new item's view so you can mess with it
    NSView *itemView = [newItem view];

    //
    // add your controls to the view here, bind, etc
    //

    return newItem;
}

@end

바라건대 이것은 당신이 필요한 곳에 가까운 곳에 있습니다 ...

다른 팁

-awakeFromNib NSCollectionViewitem의보기에서 NSCollectionView와 동일한 NIB에있는 경우 NSCOLLECTIONVIEWITEM에 대한 뷰에서 호출되지 않지만 별도의 NIB에보기를 넣는 경우 호출됩니다.

  • 빈 펜촉 파일 (blahblahcollectionviewitem.nib)을 만듭니다.
  • 컬렉션 항목을 잘라 내고 있습니다.
  • 새 NIB 파일에 붙여 넣습니다
  • 소유자의 클래스를 NSCOLLECTIONVIEWITEM으로 변경하십시오.
  • 소유자의 뷰 아울렛을 새로 붙여 넣은 시야에 연결
  • NSViewController가 포함 된 NIB 파일을 엽니 다
  • 연관된 NSViewControllEritem을 선택하십시오
  • NIB 이름 속성을 새 NIB의 이름으로 변경하십시오.
  • 코드를 유지하십시오 -awakeFromNib

-awakeFromNib 프로토 타입 NSCOLLECTIONVIEWITEM에서 복사 한 뷰는 요구되지 않습니다. 바인딩 코드를 넣으십시오 initWithCoder: 그리고 당신은 괜찮을 것입니다.

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