2015-06-10 67 views
0

我在故事板中設置了一個UITableView,靜態行中填充了不同的內容,並且所有內容都轉到單個UIViewController。對於我打算加載的每個視圖(包含不同的內容),我還有一個單獨的plist,我希望根據所選的行進行加載。作爲獎勵,我寧願有一個plist,UITableViewController將填充行(而不是在故事板中有120多個靜態行),但我不確定如何做到這一點。使用.plist中的數據加載UIViewController

我已經搜索了很多,但只找到Objective-C的東西。我對Swift有點新東西,從來沒有真正深入Objective-C,但我認爲我已經瞭解了基礎知識。

對,我的問題。我的問題是,如何在顯示UIViewController時加載每個plist(每行一個)並顯示其內容? 我的獎金問題是:我如何將我的120多個靜態行整合到基本完成同一事情的單個plist中,除了不是編輯SB來添加新行,我只需要添加到plist中?

+2

問題是什麼? – matt

+0

而不是從.plist加載數據,如何從JSON/XML加載?屬性列表很少以這種方式使用。 – Raptor

+0

@matt超越自我,更新。 – DiscoveryOV

回答

0

首先,使用plist存儲此類內容很少見。不容易維護。使用XML或json來存儲它是更好的選擇。

問候你的問題#1,

把下面的代碼到一個循環,你的plist中加載到這樣一個字典:

let path = NSBundle.mainBundle().pathForResource("Your_path", ofType: "plist") 
let dict = NSDictionary(contentsOfFile: path!) 

您可能希望所有類型的字典存儲到一個數組,所以你知道你有多少plist。假設我們在您的視圖控制器中擁有dictArray屬性來容納所有的字典。

您不在UITableView的SB上添加靜態單元,效率不高。您只需讓dataSource委託加載數據並創建儘可能多的單元即可。

我會留下一些代碼給你寫,這會讓你溫暖起來。我只是給出了代碼的基本部分。

不要忘記將您的dataSource和委託設置爲適當的對象,如self

然後,

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return dictArray.count 
    } 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier(textCellIdentifier, forIndexPath: indexPath) as UITableViewCell 

    let row = indexPath.row 
    let dictOfPlist = self.dictArray[row] 

    // now you get your plist while configuring your cells, 
    // do your customization for your cells from now on 

    return cell 
} 

// MARK: UITableViewDelegate Methods 
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    let row = indexPath.row 
    let dictOfPlist = self.dictArray[row] 

    // if you tap one cell, now you get its corresponding plist 
    // time to pass the data to your view controller 
    // either use segue or other ways to do it 
    } 
} 

將數據傳遞到您的新的UIViewController一些方法:

如果Segue公司在與2次之間的賽格瑞標識故事板的存在,你可以把它編程使用:

performSegueWithIdentifier("mySegueID", sender: yourDataDict) 

後,你可以在你的nextViewController訪問yourDataDict加載它

你也可以這樣做:

nextViewController.dataDict = yourDataDict // set a public property so you can access it later on 

presentViewController(nextViewController, animated: true, completion: nil) 

或者,如果你是在一個導航控制器:

self.navigationController?.pushViewController(nextViewController, animated: true) 

要鞏固您的Plist到一個plist中,您可能需要編寫一些小程序或腳本合併它們;或複製它們。有很多方法可以做到這一點。但正如我所建議的那樣,我不建議你繼續使用plist來做這樣的事情。開始時你最好換成另一種形式。否則,當你意識到你真的需要改變時,已經太晚了,你有很多代碼要重寫。