2012-01-30 21 views
1

私は2つのクラスを持つxcodeプロジェクトを持っています - ステム& Player、オブジェクト指向の観点からコードが堅固であることを保証しようとしています。私のステムクラスの情報にアクセスするPlayerクラス。プログラム内の別のクラスからクラスを呼び出す

私は、ステムの配列からインデックスをアクセスしたい - 私はステムが宣言されていないあるように私は許さないよプレーヤーからこれを実行しようとすると、

stem.index[i] 

を使用して、私のビューコントローラからこれを行うことができます。私はPlayer.mファイル&にStem.hをインポートしようとしましたが、プレイヤーのステムを宣言しました(ビューコントローラでこれをやっているのと似ています)、エラーを得るためにのみ( 'Stem'の前に予想される指定子 - 修飾子リスト)。

これを行う正しい方法は何ですか?私が比較的新しいので、用語の緩い使用をお許しください。事前に感謝:)

編集

ここでは、物事の上にいくつかの光を当てるかもしれないいくつかのコードである、のViewControllerで私は&は私の2つのオブジェクトが&幹のinitのalloc幹&プレーヤー

#import <UIKit/UIKit.h> 
#import <AVFoundation/AVAudioPlayer.h> 
#import "Stem.h" 
#import "Player.h" 

@interface TestApp_v1ViewController : UIViewController { 

Stem *stem; 
Player *player; 

を宣言しますplayer of viewController.m

- (void)viewDidLoad { 
    [super viewDidLoad]; 
NSLog(@"Init Successful"); 

[self loadMOV]; 
[self setupInterface]; 

stem = [[Stem alloc] init]; 
player = [[Player alloc] init]; 

} 

次に、私が宣言するStem.hに移動します。 - 再び幹(ように幹がstem.hがplayer.hにインポートされたプレイヤーにアクセス可能であるglogicさんのコメントどおり)

#import <Foundation/Foundation.h> 

@interface Stem : NSObject { 

int *index; 

int numberOfStems; 

Stem *stem; 

} 

@property(nonatomic,readwrite) int *index; 
@property(nonatomic, retain) Stem *stem; 

Player.hは次のようになります。最後に

// Player.h 
#import <Foundation/Foundation.h> 
#import "Stem.h" 

@interface Player : NSObject { 

NSMutableArray *player1; 

} 

@property(nonatomic,retain) NSMutableArray *player1; 

-(void) playAudio; 

@end 

Playerで私はインデックス配列

#import "Player.h" 

@implementation Player 
@synthesize player1; 


-(void)playAudio { 

NSLog(@"play audio called"); 

NSLog(@"index[0] is: %i", stem.index[0]); 

} 

@end 

にアクセスしようとする.Mは、私はまだステムは、任意のアイデア宣言されていないであることを言われていますか?

編集#2 - ベアボーンプログラム

を追加し、私はこれがOKと考えられているが、私は(最低限必要なものにまで切り詰め)私のプログラムを掲示することにしました願っています。私はそれが問題を理解できる唯一の方法かもしれないと思う - クラス間でたくさんのことが起こっているので。私は

私は&はのViewControllerに私の幹&プレイヤオブジェクトを初期化alloc'd ...これは今arrrgh時間のために働くために取得しようとしてきた - 私はこれはこれについて移動する最良の方法だと思ったが、多分より良い方法があります。

//Part (i) 
// TestApp_v1ViewController.h 

#import <UIKit/UIKit.h> 
#import <AVFoundation/AVAudioPlayer.h> 
#import "Stem.h" 
#import "Player.h" 

@interface TestApp_v1ViewController : UIViewController { 

Stem *stem; 
Player *player; 

} 

@property(nonatomic, retain) Stem *stem; 
@property(nonatomic, retain) Player *player; 

@end 

//Part (ii) 
// TestApp_v1ViewController.m 

#import "TestApp_v1ViewController.h" 
#import <MediaPlayer/MediaPlayer.h> 

@implementation TestApp_v1ViewController 

@synthesize stem; 
@synthesize player; 

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 
[super viewDidLoad]; 
NSLog(@"Init Successful"); 

stem = [[Stem alloc] init]; 
[stem loadURLs]; 

player = [[Player alloc] init]; 
[player playAudio]; 

int index = stem.value; 
NSLog(@"r is: %i", index); //checking to see if I can get a value from the index array - this works fine, so 'value' can be accessed from the viewController 

} 

ここで私は私が 'を含むここに私は私のプレーヤーから、後でアクセスしたいint配列& int型「値」(これが問題であることが判明したものです)

//Part (iii) 
// Stem.h 

#import <Foundation/Foundation.h> 

@interface Stem : NSObject { 

NSMutableArray *urlArray; 

int *index; 

int value; 

int numberOfStems; 

Stem *stem; 

} 

- (void)loadURLs; 
- (void)randomiseAudioForInitialPlay; 

@property(nonatomic,retain) NSMutableArray *urlArray; 
@property(nonatomic,readwrite) int *index; 
@property(nonatomic,readwrite) int numberOfStems; 
@property(nonatomic,readwrite) int value; 
@property(nonatomic, retain) Stem *stem; 

@end 

//Part (iv) 
// Stem.m 

#include <stdio.h> 
#import "Stem.h" 


@implementation Stem 

@synthesize numberOfStems; 
@synthesize urlArray; 
@synthesize index; 
@synthesize stem; 
@synthesize value; 

- (void)loadURLs 
{ 
NSLog(@"Loading URLs"); 
numberOfStems = 20; 
urlArray = [[NSMutableArray alloc] init]; 

for (int i = 1; i <= numberOfStems; i++) { 
    NSString *soundName = [NSString stringWithFormat:@"stem-%i", i]; 
    NSString *soundPath = [[NSBundle mainBundle] pathForResource:soundName ofType:@"mp3"]; 
    NSURL *soundFile = [[NSURL alloc] initFileURLWithPath:soundPath]; 
    [urlArray addObject:soundFile]; 
    [soundFile release]; 

} 

[self randomiseAudioForInitialPlay]; 

} 


- (void)randomiseAudioForInitialPlay 
{ 
index = malloc(numberOfStems*sizeof(int)); 
for (int i = 0; i < numberOfStems; i++) 
{ 
    index[i] = i; 
} 

for (int i = (numberOfStems - 1); i > 0; i--) 
{ 

    int randomIndex = arc4random() % i; 
    int tmp = index[i]; 
    index[i] = index[randomIndex]; 
    index[randomIndex] = tmp; 

} 

value = self.index[10];  //this is what needs to be accessed later, from player 

NSLog(@"value at index 10 is:%i", value); 

} 

@end 

を宣言Stem.h 'を使用すると、ステムを返すためにステムが必要になります。物事がうまくいかないところ値

//Part (v) 
// Player.h 

#import <Foundation/Foundation.h> 
#import "Stem.h" 

@interface Player : NSObject { 

Player *player; 

} 

@property(nonatomic, retain) Stem *stem; 

@property(nonatomic, retain) Player *player; 

-(void) playAudio; 

@end 

これは、私はそれが(例えば)だと見ることができるにもかかわらず、私のNSLog文はその値が0である私に語った、ステム14です。コンパイラはエラーも発生しません。

//Part (vi) 
// Player.m 

#import "Player.h" 

@implementation Player 

@synthesize player; 
@synthesize stem; 


-(void)playAudio { 

int value = stem.value; 

NSLog(@"value is:%i", value); 

} 

@end 

これはので、私は、仕事に私は私のプレーヤーのクラスにstem.valueにアクセスすることができない理由として、任意の提案を学んでいるオブジェクト指向のプロジェクトでの私の最初の適切行くのですか?

このようなプログラム内のさまざまなオブジェクトが互いに(&正しい構文)と対話する方法についての私の考えはまだ曇っているので、私のコードでクレイジーN00Bのエラーのための私を許してください:)

あなたはステムを宣言している
+0

あなたの問題をよりよく理解できるように少しコードを投稿してください。 – Tomen

+0

私は関連コードで投稿を編集しました – Octave1

答えて

3

プレーヤー内?もしあなたがplayer.hの中で宣言しているのであれば、player.hではなく、player.hの中でstem.hをimportする必要があります。

編集:あなたは、ビューコントローラでプレーヤではなくステムが宣言されているので、それはまだ宣言されていません。うーん、こっちからちょっとしたことがあるようだ。それは本当にあなたのコードが実際に

#import Stem.h 

@interface Player : NSObject { 

NSMutableArray *player1; 

} 

@property(nonatomic,retain) NSMutableArray *player1; 
@property(nonatomic,retain) Stem *stem; 

-(void) playAudio; 

@end 

import "Player.h" 

@implementation Player 
@synthesize player1, stem = _stem; 


-(void)playAudio { 

NSLog(@"play audio called"); 

NSLog(@"index[0] is: %i", _stem.index[0]);//stem.index[0] will be a problem here as its not a c array 

} 

@end 

、その後ウルコントローラで

player.stem = stem; 

とイムなぜウルは、幹の中の幹ポインタを作成するかわからないがどのように機能するかに依存しますクラス。

@interface Stem : NSObject { 

int *index; 

int numberOfStems; 
} 

@property(nonatomic,readwrite) int *index; 

、その場合の配列は、あなたがして、コントローラに

編集、それを作成したい茎:あなたはラインを持った後

player = [[Player alloc] init]; 
[player playAudio]; 

あなたが持っている

player.stem = stem; 

を追加表示コントローラーで作成したステムにプレーヤー内のポインターを割り当てる

+0

これはコメントでなければならず、回答ではありません – Tomen

+0

なぜですか?私は答えとしてplayer.hにstem.hをインポートすると言った。下投票のために厳しいようですが、病気がそれと一緒に暮らすことを学ぶ – glogic

+0

私は実際にそのエラーを作り出していたので、私は答えを見つけました。残念ながら、私の問題はかなり修正されていません... – Octave1

2

最良の方法のようなStemクラスでメソッドを作成することです:

値= [valueAtIndex幹:I];

このようにすれば、Stemクラスで値が保持される方法は公開されず、必要に応じてアクセス呼び出しを説くことなく後で変更することができます。

+0

これは私の現在の方法よりも優れています。 – Octave1

+0

私のコードCocoaFuに目を向ける可能性はありますか?大いに感謝されるでしょう:) – Octave1

+0

私は夕食後に見ていきます。 – zaph

関連する問題