我有一个带标签式浏览的故事板。其中一个选项卡是表格视图。该表由动物“标题”列表填充。按下标题时,会打开一个详细视图,除了声音和动物被点击的次数外,还会显示标题。我有一个视图控制器设置。我也有item.h / m和itemstore.h / m。还有一个详细的视图控制器。我目前的问题是,在项目商店中我设置了两个aray,但是刚刚关闭了bat xcode告诉我找不到方法定义。它还给出了我未声明的标识符错误。
FSAnimalsViewController.h(这是我的表视图控制器)
#import <AVFoundation/AVAudioPlayer.h>
#import <UIKit/UIKit.h>
#import "FSDetailViewController.h"
@interface FSAnimalsViewController : UITableViewController
{
}
@end
FSAnimalsViewController.m
#import "FSAnimalsViewController.h"
#import "FSItemStore.h"
#import "FSItem.h"
@implementation FSAnimalsViewController
- (id)init
{
// Call the superclass's designated initializer
self = [super initWithStyle:UITableViewStyleGrouped];
if (self)
{
UINavigationItem *n = [self navigationItem];
[n setTitle:@"FoxSays"];
// Create a new bar button item that will send
// addNewItem: to ItemsViewController
[[self navigationItem] setLeftBarButtonItem:[self editButtonItem]];
}
return self;
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[self tableView] reloadData];
}
- (id)initWithStyle:(UITableViewStyle)style
{
return [self init];
}
- (void)tableView:(UITableView *)aTableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
FSDetailViewController *detailViewController = [[FSDetailViewController alloc] init];
NSArray *items = [[FSItemStore defaultStore] allItems];
FSItem *selectedItem = [items objectAtIndex:[indexPath row]];
// Give detail view controller a pointer to the item object in row
[detailViewController setItem:selectedItem];
// Push it onto the top of the navigation controller's stack
[[self navigationController] pushViewController:detailViewController
animated:YES];
}
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section
{
return [[[FSItemStore defaultStore] allItems] count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// Set the cell identifier
static NSString *CellIdentifier = @"BasicCell";
// Reuse the cell from the identifier
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
// Configure the cell if it doesn't exist
if (!cell)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
// Log the row for debugging
NSLog(@"%d", [indexPath row]);
// Get object from store
FSItem *item = [[[FSItemStore defaultStore] allItems] objectAtIndex:[indexPath row]];
// Set label to from property in object
[[cell textLabel] setText:[item title]];
return cell;
}
@end
FSItem.h
#import <Foundation/Foundation.h>
#import <AudioToolbox/AudioToolbox.h>
#import <AVFoundation/AVAudioPlayer.h>
@interface FSItem : NSObject
@property (nonatomic, copy) NSString *title;
@property (nonatomic) SystemSoundID *sound;
@property (nonatomic) int plays;
- (NSArray *)animals;
- (NSArray *)sounds;
@end
FSItem.m
#import <AudioToolbox/AudioToolbox.h>
#import "FSItem.h"
@implementation FSItem
NSString *title;
SystemSoundID *sound;
int plays;
- (NSArray *)animals
{
NSArray *animals = [NSArray arrayWithObjects:@"Dog",@"Cat",@"Bird",@"Mouse",@"Cow",@"Frog",@"Elephant",@"Duck",@"Fish",@"Seal",@"Fox", nil];
return animals;
}
- (NSArray *)sounds
{
NSArray *sounds = [NSArray arrayWithObjects:
@"Woof.mp3",
@"Meow.mp3",
@"tweet.mp3",
@"Squeak.mp3",
@"Moo.mp3",
@"Croak.mp3",
@"Toot.mp3",
@"Quack.mp3",
@"Blub.mp3",
@"OWOwOw.mp3",
@"Fox.mp3",
nil];
return sounds;
}
@end
FSItemStore.h
#import <AVFoundation/AVAudioPlayer.h>
#import <AudioToolbox/AudioToolbox.h>
#import <Foundation/Foundation.h>
@class FSItem;
@interface FSItemStore : NSObject
{
NSMutableArray *allItems;
}
@property (nonatomic) int i;
+ (FSItemStore *)defaultStore;
- (NSArray *)allItems;
- (NSArray *)animals;
- (NSArray *)sounds;
- (FSItem *)createItem;
@end
FSItemStore.m
#import <AudioToolbox/AudioToolbox.h>
#import "FSItem.h"
#import "FSItemStore.h"
@implementation FSItemStore
int i = 0;
- (NSArray *)allItems
{
return allItems;
}
+ (FSItemStore *)defaultStore;
{
static FSItemStore *defaultStore = nil;
if(!defaultStore)
defaultStore = [[super allocWithZone:nil] init];
return defaultStore;
}
- (FSItem *)createItem
{
FSItem *item = [[FSItem alloc] init];
if (i < [animals count])
{
[item setTitle: [animals objectAtIndex: i]];
[item setSound: [sounds objectAtIndex: i]];
[item setPlays: 0];
i++;
[allItems addObject: item];
}
return item;
}
@end
FSItemStore似乎是我的问题所在。它说没有找到声音和动物的方法定义,声音和动物都是未声明的标识符。有人有任何想法吗?
答案 0 :(得分:2)
你的问题是,在你的H文件中,你声明你的类将实现一个名为animals的方法,它将返回一个NSArray,一个方法调用声音将返回另一个NSArray,但在你的M文件中你没有实现这些方法
在你的FSItemStore.m中你应该实现这些方法:
- (NSArray *)animals{
//Do whatever this method is supposed to do, return an NSArray.
}
- (NSArray *)sounds
{
//Do whatever this method is supposed to do, return an NSArray.
}
修改强>
如果您假装FSItemStore继承了FSItem中的方法,则必须以这种方式声明接口:
@interface FSItemStore : FSItem //FSItem instead of NSObject
{
NSMutableArray *allItems;
}
答案 1 :(得分:0)
如果我正确理解了您的代码,您需要将FSItem :: sounds和FSItem :: animals中初始化的动物和声音之一设置为您在FSItemStore :: createItem中创建的新项目。所以动物和声音方法应该在正确的对象上执行 - 即FSItem对象。将FSItemStore :: createItem中的代码更改为此 -
- (FSItem *)createItem
{
FSItem *item = [[FSItem alloc] init];
if (i < [animals count])
{
[item setTitle: [[item animals] objectAtIndex: i]];
[item setSound: [[item sounds] objectAtIndex: i]];
[item setPlays: 0];
i++;
[allItems addObject: item];
}
return item;
}
这仍然是做你想做的事情的坏方法,因为NSArray会在你每次创建项目时被初始化。如果声音和动物的数量是固定的,那么最好定义它们,以便它们只被初始化一次,例如FSItem中的静态对象或FSItemStore上的属性
答案 2 :(得分:0)
您尚未定义任何名为animals或items的属性或变量。您只定义了getter方法。
e.g。
@property(nonatomic,strong) NSArray *animals;
@property(nonatomic,strong) NSArray *items;
然后你的getter的实现会返回这些属性。