2012-03-13 70 views
1

我做我的iOS中的第一場比賽,我需要加載一些的水平,存儲爲XML。級別文件存儲在本地,一切正常工作從模擬器。但是,由於XML是在運行時加載的,當我嘗試在實際設備上測試我的遊戲時,它無法找到XML文件,因爲它們實際上並不是應用程序的一部分。嵌入XML到iOS應用

我從Flash背景的,所以我可能有一種錯誤的想法如何,這是iOS上完成,但我需要以某種方式捆綁與應用程序的XML文件,或將其嵌入某種方式的代碼?這可能嗎?

感謝很多:)

+0

只是將它們添加到您的項目在Xcode如果您正在使用訪問它們的一些奇怪的機制 – govi 2012-03-13 11:02:05

+0

如果你的XML文件位於Xcode項目,以及你如何加載XML到項目中。 – iDroid 2012-03-13 11:04:13

+0

嗯,它位於「資源」組內,位於主文件夾內。 [NSURL fileURLWithPath ......我在這裏使用絕對路徑,也許它只是:我與[的NSXMLParser頁頭] initWithContentsOfURL加載它?但我不知道如何用相對路徑引用它。 – Dabrorius 2012-03-13 11:52:41

回答

6

那麼查找你的應用程序包指定的文件是

NSString *path = [[NSBundle mainBundle] pathForResource:@"fileName.xml" ofType:nil] 
NSURL *xmlURL = [NSURL fileURLWithPath:path]; 
[[NSXMLParser alloc] initWithContentsOfURL: xmlURL] 

希望這有助於你...

+1

謝謝,它的工作:)只有兩個小的錯別字:mainbundle應該mainBundle和APthForResource應pathForResource – Dabrorius 2012-03-13 17:57:19

+0

感謝您指出的錯誤,他們現在正在編輯。 – iDroid 2012-03-13 20:27:56

+0

感謝編輯@Jason Struges – iDroid 2015-10-29 08:03:54

1

您可以添加XML文件到您的項目和運行時間的東西從頭讀到這樣

NSArray *myPathList = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

NSString *myPath = [myPathList objectAtIndex:0]; 
NSError **err; 
myPath = [myPath stringByAppendingPathComponent:fileName]; 

if([[NSFileManager defaultManager] fileExistsAtPath:myPath]) 
    text = [NSString stringWithContentsOfFile:myPath encoding:NSUTF8StringEncoding error:err]; 

你可以考慮,而不是XML使用JSON。至少據我所知,可用的XML解析器並不像使用SBJson那樣簡單(https://github.com/stig/json-framework/)

+0

的'NSXMLParser'蘋果是非常好的一個,我同意你關於考慮JSON數據,而不是XML的。它讓你的生活更輕鬆,在ios5中你不需要額外的框架,而是蘋果添加了'NSJsonSerialization'來序列化和反序列化JSon對象。 – iDroid 2012-03-13 13:01:11

+0

你對'NSJsonSerialization'完全正確。它也表現更好[見這裏測量](http://blog.skulptstudio.com/nsjsonserialization-vs-sbjson-performance)。但是,如果你想讓你的代碼在IOS5之前的設備上工作,你必須去尋找其他的選擇。 – EsbenB 2012-03-13 14:03:30

+0

是啊這就是爲什麼我代表它包含在ios 5.並感謝您的鏈接。 – iDroid 2012-03-13 14:58:20

0

這裏是我的雨燕3.0的解決方案。除了代碼之外,您還需要將您的xml文件作爲數據集添加到您的Assets.xcassets中。通過創建一個新的數據集,給它任意名稱,然後將xml文件從查找器拖到新創建的數據集中來完成。當您在代碼中引用文件時,您將使用文件的文件名,而不是數據集的名稱。

var parseResults = false 

if let path = Bundle.main.path(forResource: fileName, ofType: ".xml") { 
    let url = URL(fileURLWithPath: path) 
    if let xmlParser = XMLParser(contentsOf: urlToFile) { 
     xmlParser.delegate = self 
     parseResults = xmlParser.parse() 
    } 
}