2011-06-14 51 views
0

我在代碼中完全構建了UIView的子類(無IB),我們稱之爲ContentView。在這個視圖中,我已經設置了幾個聲音和視頻播放器,以及幾個imageViews(沒什麼特別的)。使用NSString爲每個視圖子類加載不同的媒體文件* const

接下來,我打算將ContentView分類幾次,以便爲每個視圖加載不同的媒體。所有這些視圖都有相同的視圖控制器,因爲界面對於所有視圖都是相同的,只有內容(聲音,視頻和圖像)會改變。

所以我的辦法處理這一問題是在宣佈幾個NSString *const內容查看 h和在內容查看的每個子視圖的實現文件中指定的鍵/值,在static NSString *const的形式,因爲我會重新使用它們爲每個視圖加載不同的媒體,並且不希望它們位於全局名稱空間中。

下面是一些樣機代碼,說明了什麼我談論:

在ContentView.h

@interface ContentView : UIView { 

NSString *const kSoundFile1; 
NSString *const kSoundFile2; 
NSString *const kSoundFileType; 
NSString *const kMovieFile1; 
NSString *const kMovieFile2; 
NSString *const kMovieFileType; 
NSString *const kImage1; 
NSString *const kImage2; 

和ContentView.m,那種東西,

@implementation ContentView 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
     if (self) { 

     NSString *filePath1 = [[NSBundle mainBundle] pathForResource: kSoundFile1 
                 ofType: kSoundFileType; 

     NSURL *url1 = [[NSURL alloc] initFileURLWithPath:filePath1]; 

     AVAudioPlayer *audioPlayer1 = [AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; 
     [audioPlayer1 prepareToPlay]; 
     [url1 release]; 

...等等,對於其餘的聲音文件和電影(除了圖像,我正在使用imageNamed:)。

然後在內容查看的每個子類實現文件我剛纔這樣的:

@implementation ContentViewSubclass 

static NSString *const kSoundFile1 = @"sound1"; 
static NSString *const kSoundFile2 = @"sound2"; 
static NSString *const kSoundFileType = @"wav"; 
static NSString *const kMovieFile1 = @"movie1"; 
static NSString *const kMovieFile2 = @"movie2"; 
static NSString *const kMovieFileType = @"mov"; 
static NSString *const kImage1 = @"image1.png"; 
static NSString *const kImage2 = @"image2.png"; 

@end 

我不能做這項工作。沒有編譯器錯誤或警告,只是沒有播放或顯示。我做錯了什麼,還是這不是解決問題的正確方法?

我真的很感謝一些見解。提前致謝。

+0

你是否已經通過調試器完成代​​碼,看看哪些失敗? – Mark 2011-06-14 11:47:21

+0

是的,我有。問題在於子類中的靜態NSString常量聲明。 – MiguelB 2011-06-14 12:50:59

回答

1

雖然以下來自@deanWombourne的回答非常有意義,但我的解決方案存在問題。但是我發現它有什麼問題(至少這是我的看法,現在它正在工作)。

一個UIView子類已經擁有自己的指定初始化,這是-(id)initWithFrame,因此呼籲內容查看的任何後續的子類-(id)init不會更新任何實例變量,因爲[super init]引導到不通(或更​​好的,第一超運行initWithFrame,然後才運行init,這與無所作爲相同)。

所以我的解決辦法是:

@implementation ContentViewSubclass 

- (id)initWithFrame:(CGRect)frame { 

     kSoundFile1 = @"sound1"; 
     kSoundFile2 = @"sound2"; 
     kSoundFileType = @"wav"; 
     kMovieFile1 = @"movie1"; 
     kMovieFile2 = @"movie2"; 
     kMovieFileType = @"mov"; 
     kImage1 = @"image1.png"; 
     kImage2 = @"image2.png"; 

    self = [super initWithFrame:frame]; 
    if (self) { 

    } 
    return self; 
} 

@end 

首先更新在指定的字符串(改變高德上ContentView.h到NSString *pointer的形式,例如,NSString *kSoundFile1後)初始化程序-(id)initWithFrame,然後才調用超級。 現在它工作得很好。

衷心感謝@deanWombourne爲解決這一問題提供的幫助。

0

編輯:這個答案是完全吠叫錯誤的樹。嘗試this one代替:)


我立刻尋找這一行:

AVAudioPlayer *audioPlayer1 = [AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; 

的SDK 希望告訴你的錯誤,但你問它不是。然後你抱怨沒有錯誤!

試試這個:

NSError *error = nil; 
AVAudioPlayer *audioPlayer1 = [AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; 
if (error) { 
    NSLog(@"error : %@", error); 
} 

,讓我們知道你所看到的。

+0

我只是把玩家代碼說明我是如何使用常量的。我很確定問題是在主uiview類之外聲明靜態NSString常量。但是我會把錯誤信息放在裏面。只要給我幾個。 – MiguelB 2011-06-14 12:48:59

+0

確定,錯誤消息如下:錯誤:錯誤域= NSOSStatusErrorDomain代碼= 1954115647「的操作無法完成(OSStatus錯誤1954115647.)。」 – MiguelB 2011-06-14 12:53:41

+0

嗯,這不是非常有幫助!雖然快速谷歌該錯誤代碼確實發現了這個問題(並回答!)http://stackoverflow.com/questions/4901709/iphone-avaudioplayer-unsupported-file-type – deanWombourne 2011-06-14 13:04:51

0

我想我可能已經工作了,我無視對方的回答:)

你設置了串起來的內容查看(在ContentView.h)的成員。他們開始初始化爲nil

然後,在每個子類中,您創建新的字符串具有相同的名稱,但只在該.m文件中(static關鍵字可以!)。只是怎麼一回事,因爲他們在C代碼相同的名稱並不意味着他們會指向同一個對象:)

你ContentView.m文件不能看到新的字符串,它只是使用在中定義的你.h文件,它從來沒有被設置爲任何東西,所以我打賭他們仍然是nil

你需要在你的子類來定義字符串是這樣的:

@implementation ContentViewSubclass 

- (id)init { 
    self = [super init]; 
    if (self) { 
     kSoundFile1 = @"sound1"; 
     kSoundFile2 = @"sound2"; 
     kSoundFileType = @"wav"; 
     kMovieFile1 = @"movie1"; 
     kMovieFile2 = @"movie2"; 
     kMovieFileType = @"mov"; 
     kImage1 = @"image1.png"; 
     kImage2 = @"image2.png"; 
    } 
    return self; 
} 

@end 

PS的k在這些名字中的前並沒有太大的意義了 - 我想擺脫它)

+0

院長,你的回答很有道理。但我認爲我還在做錯事。好吧,所以我將ContentView.h中的字符串聲明更改爲'NSString * pointer;'(取出const'位)。然後,我使用子類的.m文件中的值「初始化」,就像你在上面發佈的那樣。而我什麼也得不到。 – MiguelB 2011-06-14 13:53:31

相關問題