私は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のエラーのための私を許してください:)
あなたはステムを宣言している
あなたの問題をよりよく理解できるように少しコードを投稿してください。 – Tomen
私は関連コードで投稿を編集しました – Octave1