アレイコントローラーをボタンのターゲットにする

私は NSArrayControllerCOCOA PROGRAMMING FOR MAC OS X(3RD EDITION)の章で作業しています。

Ctrlキーを押しながらドラッグして、アレイコントローラを[Add New Employee]ボタンのターゲットにします。追加するアクションを設定します。

しかし、アレイコントローラーの上にドラッグすると、強調表示されないので、ターゲットオプションは表示されません。

How do I do this correctly in the new XCode

フルサイズの画像

document.h:

//
//  Document.h
//  RaiseMan
//
//  Created by user on 11/12/11.
//  Copyright (c) 2011 __MyCompanyName__. All rights reserved.
//

#import 

@interface Document : NSDocument
{
    NSMutableArray *employees;
}

@end

document.m:

//
//  Document.m
//  RaiseMan
//
//  Created by user on 11/12/11.
//  Copyright (c) 2011 __MyCompanyName__. All rights reserved.
//

#import "Document.h"

@implementation Document

- (id)init
{
    self = [super init];
    if (self) {
        employees = [[NSMutableArray alloc] init];
    }
    return self;
}

- (void)dealloc
{
    [self setEmployees:nil];
    [super dealloc];
}


-(void)setEmployees:(NSMutableArray *)a
{
    //this is an unusual setter method we are goign to ad a lot of smarts in the next chapter
    if (a == employees)
        return;
    [a retain];
    [employees release];
    employees = a;
}

- (NSString *)windowNibName
{
   //Override returning the nib file name of the document
   //If you need to use a subclass of NSWindowController or if your document supports multiple NSWindowControllers, you should remove this method and override -makeWindowControllers instead.
    return @"Document";
}

- (void)windowControllerDidLoadNib:(NSWindowController *)aController
{
    [super windowControllerDidLoadNib:aController];
   //Add any code here that needs to be executed once the windowController has loaded the document's window.
}

- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError
{
    /*
     Insert code here to write your document to data of the specified type. If outError != NULL, ensure that you create and set an appropriate error when returning nil.
    You can also choose to override -fileWrapperOfType:error:, -writeToURL:ofType:error:, or -writeToURL:ofType:forSaveOperation:originalContentsURL:error: instead.
    */
    NSException *exception = [NSException exceptionWithName:@"UnimplementedMethod" reason:[NSString stringWithFormat:@"%@ is unimplemented", NSStringFromSelector(_cmd)] userInfo:nil];
    @throw exception;
    return nil;
}

- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError
{
    /*
    Insert code here to read your document from the given data of the specified type. If outError != NULL, ensure that you create and set an appropriate error when returning NO.
    You can also choose to override -readFromFileWrapper:ofType:error: or -readFromURL:ofType:error: instead.
    If you override either of these, you should also override -isEntireFileLoaded to return NO if the contents are lazily loaded.
    */
    NSException *exception = [NSException exceptionWithName:@"UnimplementedMethod" reason:[NSString stringWithFormat:@"%@ is unimplemented", NSStringFromSelector(_cmd)] userInfo:nil];
    @throw exception;
    return YES;
}

+ (BOOL)autosavesInPlace
{
    return YES;
}


    - (void)setEmployees:(NSMutableArray *)a;

    @end

person.h:

//
//  Person.h
//  RaiseMan
//
//  Created by user on 11/12/11.
//  Copyright (c) 2011 __MyCompanyName__. All rights reserved.
//

#import 

@interface Person : NSObject
{
    NSString *personName;
    float expectedRaise;
}

@property (readwrite, copy) NSString *personName;
@property (readwrite) float expectedRaise;

@end

person.m:

//
//  Person.m
//  RaiseMan
//
//  Created by user on 11/12/11.
//  Copyright (c) 2011 __MyCompanyName__. All rights reserved.
//

#import "Person.h"

@implementation Person

- (id) init
{
    self = [super init];
    expectedRaise = 5.0;
    personName = @"New Person";
    return self;    
}

- (void)dealloc
{
    [personName release];
    [super dealloc];
}

@synthesize personName;
@synthesize expectedRaise;

@end
0
完全なコードを追加
追加された 著者 ian,
ここにプロジェクトのジップがあります: sharesend.com/2w9uo
追加された 著者 ian,
あなたはまた、いくつかの場所であなたのコードをアップロードすることができます...我々は確認することができますか?
追加された 著者 Devarshi,
あなたのコードは大丈夫です...ドロップボックスや他のファイル共有サービスのアカウントをお持ちの場合は、問題を再現して解決できるようにアップロードできますか?
追加された 著者 Devarshi,

1 答え

あなたはIBでそれを間違ってやっています。これは間違っています -

enter image description here

これらのエントリは、アレイコントローラの属性インスペクタで作成する必要があります。

enter image description here

一度修正すれば、ターゲットを正しく設定できるようになります:)

2
追加された
実際に私はそれをキャッチし、それを修正し、まだ動作しません...
追加された 著者 ian,
確かに、私がターゲットにしようとすると、配列オブジェクトは強調表示されません。
追加された 著者 ian,
ピーター!それがそれでした。それを答えにしたいのなら、ここに置いてください。
追加された 著者 ian,
あなたはまだ目標を設定できませんか?他のバインディングも確認して確認してください!
追加された 著者 Devarshi,
Miraajが彼の答えで言ったことは、あなたがアレイコントローラではないということです。あなたは、それを person オブジェクトに変換しました。これは、配列コントローラの配列に保持することを意味しています。そのため、ボタンを接続することができませんでした。 person にはアクションがありません。オブジェクトのカスタムクラスをクリアしても問題が解決しない場合は、アイデンティティと属性のインスペクタの更新されたスクリーンショット、またはコードの更新されたコピーを含むように質問を編集してください。
追加された 著者 Peter Hosey,