#cocoa #xcode4.2
#cocoa #xcode4.2
Вопрос:
Я работаю над главой COCOA PROGRAMMING FOR MAC OS X (3RD EDITION)
on NSArrayController
, и в ней говорится, что мне нужно:
Управление -перетащите, чтобы контроллер массива стал целью кнопки Добавить нового сотрудника. Задайте действие для добавления:
Однако, когда я перетаскиваю array controller
, он не подсвечивается, поэтому я не получаю целевых параметров.
Как мне сделать это правильно в новом XCode
изображение в натуральную величину
document.h:
//
// Document.h
// RaiseMan
//
// Created by user on 11/12/11.
// Copyright (c) 2011 __MyCompanyName__. All rights reserved.
//
#import <Cocoa/Cocoa.h>
@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 <Foundation/Foundation.h>
@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
Комментарии:
1. можете ли вы также загрузить свой код в какое-нибудь место… чтобы мы могли проверить?
2. ваш код выглядит нормально … если у вас есть учетная запись в drop box или какой-либо другой службе обмена файлами, можете ли вы загрузить ее, чтобы мы могли воспроизвести вашу проблему и решить ее?
3. вот zip-файл проекта: sharesend.com/2w9uo
Ответ №1:
Чувак.. вы делаете это неправильно в IB. Это неправильно —
Эти записи должны быть сделаны в инспекторе атрибутов для контроллера массива —
Как только вы исправите это, вы сможете правильно установить цель 🙂
Комментарии:
1. вы все еще не можете установить target? Пожалуйста, проверьте также другие привязки!
2. да, объект array просто не будет выделяться, когда я пытаюсь настроить таргетинг на него.
3. @ian: Результатом того, что Miraj сказал в своем ответе, является то, что вы сделали это не контроллером массива. Вы превратили его в
person
объект, который вы намереваетесь сохранить в массиве контроллера массива. Вот почему вы не смогли подключить к нему кнопки: уperson
нет никаких действий. Если вы очистили пользовательский класс объекта, а он по-прежнему не работает, пожалуйста, отредактируйте свой вопрос, включив обновленный скриншот инспекторов идентификации и атрибутов или обновленную копию кода.4. Питер! Это сделало это. Если вы хотите превратить это в ответ, разместите его здесь.