0

我对类和对象很陌生,我有一个问题:

  • 我正在跟踪可以由 textFields 输入的书籍。
  • 每本书 3 个属性:标题、作者和描述。

我想要做的是将所有书籍对象放在一个NSMutableArray名为:Collection 中。(目前只有一本书(objectAtIndex:0)目前正在工作,但是当我试图将它们吐出来时,我只得到了这本书的描述。我很想得到所有的项目(标题、作者、描述)。

我一直想知道的是:我应该创建一个新的(集合)类,例如名为 BookCollection 并在那里创建一个数组吗?但是我将如何初始化它等?

代码如下,欢迎帮助和提示!(大约一个月前开始)

Book.h

#import <Foundation/Foundation.h>

@interface Book : NSObject
@property(nonatomic,strong)NSString* title;
@property(nonatomic,strong)NSString* author;
@property(nonatomic,strong)NSString* description;

-(id)initWithTitle:(NSString*)newTitle withAuthor:(NSString*)newAuthor andDescription:(NSString*)newDesription;  

Book.m

#import "Book.h"

@implementation Book
@synthesize title,author,description;

-(id)initWithTitle:(NSString*)newTitle withAuthor:(NSString*)newAuthor andDescription:(NSString*)newDesription{
    self = [super init];
    if (self) {
        title = newTitle;
        author = newAuthor;
        description = newDesription;
    }
    return self;
}

@end

AppDelegate.m

#import "AppDelegate.h"
@implementation AppDelegate
@synthesize lblTitle,lblAuthor,lblDescription;
@synthesize collection;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
}

- (IBAction)buttonClick:(id)sender {
    //alloc the array that will hold the books
    collection = [[NSMutableArray alloc]init];

    //create a new book
    Book *newBook = [[Book alloc]initWithTitle:[lblTitle stringValue] withAuthor:[lblAuthor stringValue] andDescription:[lblDescription stringValue]];

    //logging the items of the book
    NSLog(@"%@",newBook.description);
    NSLog(@"%@",newBook.title);
    NSLog(@"%@",newBook.author);

    //adding the book to the collection
    [collection addObject:newBook];


    //logging the book items from the collection

    NSLog(@"%@",[collection objectAtIndex:0]);

    //problem... only logs 1 item from the object...

}
@end

AppDelegate.h

#import <Cocoa/Cocoa.h>
#import "Book.h"

@interface AppDelegate : NSObject <NSApplicationDelegate>
@property(nonatomic,strong)NSMutableArray *collection;
@property (assign) IBOutlet NSWindow *window;
@property (weak) IBOutlet NSTextField *lblTitle;
@property (weak) IBOutlet NSTextField *lblAuthor;
@property (weak) IBOutlet NSTextField *lblDescription;
- (IBAction)buttonClick:(id)sender;

@end
4

3 回答 3

0

您需要定义 Book 类的-description方法。

当您调用NSLog(@"%@", someObject)时,对象的-description方法被调用并放置在%@格式说明符中。您需要覆盖 Book 类的-description方法以打印出所有对象的字段。

看看这里有一个很好的例子。

为了澄清,当你打电话时:

NSLog(@"%@",newBook.description);
NSLog(@"%@",newBook.title);
NSLog(@"%@",newBook.author);

您正在(非常正确地)记录每个单独的字段。但是,当您致电时:

NSLog(@"%@",[collection objectAtIndex:0]);

你本质上是在写:

NSLog(@"%@",newBook); // Gets an NSString from [newBook description];

因此,您需要- (NSString *)desctiprionBook该类实现以获得您所追求的日志记录行为。

于 2013-09-28T05:46:46.097 回答
0

Step 1: 从方法中删除collection = [[NSMutableArray alloc]init];- (IBAction)buttonClick:(id)sender放入applicationDidFinishLaunching。问题是每次将新书添加到集合数组时,您都在初始化数组。

To Iterate: Array 的所有对象都使用以下代码段

[collection enumerateObjectsUsingBlock:^(id obj, NSUInteger index, BOOL *stop){
    Book *objBook = (Book *)obj;

    NSLog(@"%@",objBook.description);
    NSLog(@"%@",objBook.title);
    NSLog(@"%@",objBook.author);;
}];
于 2013-09-28T06:08:42.983 回答
0

这个描述方法太棒了!我不知道这甚至有可能@PLPiper!谢谢

虽然它变得更难......在这一刻我只是把它全部记录下来(对于我作为开发人员来说)。但是例如......如果我想要标签中的所有这些属性(字符串值)。因此,如果我想通过我的阵列将它们全部吐出,那将如何工作?

我已经看到使用以下我喜欢的示例(有点)的代码,而且它很容易阅读。

for (int i = 0; (i<=[collection.count]); i++) {
    [titleLabel setStringValue:[dateCollection objectAtIndex:i].title]
    [authorLabel setStringValue:[dateCollection objectAtIndex:i].author]
    [descriptionLabel setStringValue:[dateCollection objectAtIndex:i].description]

}

理论上这应该可行,但实际上我在这里遗漏了一些东西......

于 2013-09-29T00:15:22.897 回答