2014-06-13 13 views
12

के लिए ऑब्जेक्ट्स के रूप में स्विफ्ट प्लिस्ट पढ़ना और प्रारंभ करना Arrays स्विफ्ट में एक छोटा UITableView-आधारित ऐप विकसित कर रहा हूं। मैं बाहर शुरू कर दिया (जैसे कुछ बुनियादी सरणियों शामिल बुनियादी वर्ग घोषणा और UITableView आउटलेट घोषणा हार्ड-कोड है:कुंजी

import UIKit 

class ScenesViewController: UITableViewController { 

@IBOutlet var myTableView: UITableView 

var sceneName = ["Scene 1", "Scene 2", "Scene 3", "Scene 4", "Scene 5"] 
var sceneDetail = ["Hi", "Hello", "Bye", "My Bad", "Happy"] 

इस कोड को एक UITableViewController जो एक आउटलेट है कि सभी एक UITableView को झुका रहा है अंदर है। ऑब्जेक्टिव-सी में, मैं यह करना होगा मैं इस तथाकथित "Scenes.plist" के लिए एक plist बनाया है और कोड को बदलने का प्रयास किया है:।

:

NSString *path = [[NSBundle mainBundle] pathForResource:@"Scenes" ofType:@"plist"]; 

NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path]; 
sceneName = [dict objectForKey:@"SceneName"]; 
sceneDetail = [dict objectForKey:@"SceneDetail"]; 

मैं इस तरह स्विफ्ट में यह कर शुरू कर दिया

let path = NSBundle.mainBundle().pathForResource("Scenes", ofType:"plist") 

let dict = NSDictionary(contentsOfFile:path) // Error: 'ScenesViewController.Type' does not have a member named 'path' 

मैंने समाधान के लिए इंटरनेट को खराब कर दिया लेकिन एक खोजने में असमर्थ था। एकमात्र समाधान मैं लगभग एक लाइन पर प्रत्येक सरणी के लिए यह सब कर रहा है का सहारा कर सकते हैं

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

var sceneName = dict["SceneName"] // Error: 'ScenesViewController.Type' does not have a member named 'dict' 

अब,:

एक 'लगभग' एक लाइनर - तो मैं कार्रवाई के अगले पाठ्यक्रम शुरू कर दी
var sceneName = NSDictionary(contentsOfFile: 
    NSBundle.mainBundle().pathForResource("Scenes", ofType:"plist").objectForKey("SceneName") 
// Warning: Variable 'sceneName' inferred to have type 'AnyObject!', which may be unexpected 
// Fix-It: Add an explicit type annotation to silence this warning (var sceneName: AnyObject! = ...) 

इसलिए मैंने यह पता लगाने के लिए स्पष्ट प्रकार की एनोटेशन जोड़ा कि अधिक त्रुटियां थीं। cellForRowAtIndexPath: समारोह के अंदर:

override func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath?) -> UITableViewCell? { 
    let cell: UITableViewCell = tableView!.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) as UITableViewCell 

    // Configure the cell... 

    cell.textLabel.text = sceneName[indexPath!.row] // Error: could not find member 'row' 
    return cell 
} 

वास्तव दो त्रुटियाँ हैं; मुझे नहीं पता कि यह गलती से डुप्लिकेट है या नहीं। फिर

override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) { 
    if segue?.identifier == "ShowDetails" { 
     var detailVC: ScenesDetailViewController = segue!.destinationViewController as ScenesDetailViewController 

     var myIndexPath: NSIndexPath = myTableView.indexPathForSelectedRow() 

     var row: Int = myIndexPath.row 

     detailVC.detailModal = [sceneDetail[row], sceneName[row]] // Error: Could not find an overload for 'subscript' that accepts the supplied arguments 
    } 
} 

, वहाँ दो त्रुटियाँ हैं;: अगले त्रुटि (रों) prepareForSegue:sender: विधि में हैं हालांकि, मुझे विश्वास है कि ऐसा इसलिए है क्योंकि sceneDetail और sceneName दोनों का उपयोग किया जाता है। ऑब्जेक्टिव-सी में ऐसी फाइलों में प्लेलिस्ट पढ़ने और उपयोग करने के साथ-साथ वहां मौजूद त्रुटियों (या जो मैं नहीं आया) में जगहों में त्रुटियां प्रतीत होती हैं।

अग्रिम धन्यवाद,

-KodInc

+0

'एनआईएसएनडीएक्सपीथ' की' पंक्ति' और 'खंड' गुणों को 'UIKit' में परिभाषित किया गया है, न कि' फाउंडेशन '। क्या आपकी फ़ाइल में 'आयात UIKit' जोड़ना इस समस्या को हल करता है? – Jack

+0

@ जैकव्यू 'UIKit' पहले से ही आयात किया जा चुका है; यह पहली पंक्ति – KodInc

उत्तर

19

अपने प्रारंभिक समस्या को हल करने के लिए एक समारोह के अंदर कोड डाल दिया, जैसे: एक में अपने कोड को ले जाकर

var memoryName = [] 
var memoryDetail = [] 

override func awakeFromNib() { 
    super.awakeFromNib() 

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

    memoryName = dict["MemoryName"] as Array<String> 
    memoryDetail = dict["MemoryDetail"] as Array<String> 
} 
+0

धन्यवाद है। इससे मूल समस्या में मदद मिली। हालांकि, बाद में त्रुटियों को मैन्युअल रूप से तय किया जाना था। क्या आप कृपया बता सकते हैं कि आपकी स्पष्टीकरण क्यों काम करती है जो मैं गलत कर रहा था? इसके अलावा, StackOverflow को निर्देशित किया गया है, अगर मेरे प्रश्न के उत्तर भाग स्पष्टीकरण के बिना (जैसा कि यह उत्तर करता है), क्या मैं इसे स्वीकार करता हूं? - कोडिनक – KodInc

1

आप इस हल कर सकते हैं फ़ंक्शन जिसे आपके ऑब्जेक्ट प्रारंभ करने के बाद बुलाया जाता है।

गुण आपकी वस्तु के प्रारंभ के हिस्से के रूप में आरंभ किए गए हैं। आपने गुणों के रूप में पथ और निर्देश बनाया है और उन्हें कोड के साथ प्रारंभ करने की कोशिश कर रहे हैं जो प्रारंभिकरण की आवश्यकताओं को पूरा नहीं करते हैं।

एक प्रारंभकर्ता किसी भी घटना के तरीकों कॉल नहीं कर सकते, किसी भी घटना के गुण के मूल्यों को पढ़ने, या जब तक प्रारंभ के पहले चरण के बाद पूरा हो गया है एक मूल्य के रूप में स्वयं को देखें।

- स्विफ्ट प्रोग्रामिंग भाषा - प्रारंभ - सुरक्षा जांच 4

इसके अलावा, ऐसा लगता है कि आप केवल चाहते हैं और, sceneName और sceneDetail जरूरत गुण होने के लिए, ताकि आप उन्हें पूरी तरह से स्थानांतरित कर सकते हैं उस पद्धति के दायरे में जो आप प्रारंभ करने के बाद sceneDetail और sceneName को पॉप्युलेट करने के लिए उपयोग करते हैं।

मेरे लिए यह कहना मुश्किल है कि सबस्क्रिप्ट त्रुटि बिल्कुल है क्योंकि मुझे नहीं लगता कि किस प्रकार का डेटा विवरणVC.detailModal होना चाहिए; फिर भी, ऐसा लगता है कि गलत प्रकार का ऑब्जेक्ट विस्तारित मॉड्यूल सरणी में पारित किया जा रहा है। इस समस्या का एक अच्छा सा वर्णन Swift and arrays