2014-06-13 27 views
12

Swift'de küçük bir UITableView tabanlı uygulama geliştiriyorum.Swift Plist Key için Nesneleri Okuma ve Başlatma Dizisi

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"] 

Bu kod tüm UITableView bağladım bir prizi olan bir UITableViewController içeride: Temel sınıf beyanı ve UITableView çıkış beyanı dahil gibi bazı temel diziler (sert kodlama başladı. Objective-C, ben bu yapacağını ben bu sözde "Scenes.plist" için bir plist yarattık ve kodunu değiştirmek çalıştılar.

:

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

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

böyle Swift bu yapmaya başladı

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

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

İnternet için bir çözüm buldum ama bulamadım. Bu yüzden eylem sonraki ders aldı - Bir 'neredeyse' tek-liner:

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

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

Şimdi, neredeyse her dizi için tek bir satırda bütün bunlar yaşıyor çare olabilir tek çözüm:

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! = ...) 

Bu nedenle, yalnızca daha fazla hata olduğunu öğrenmek için açık tür ek açıklamalarını ekledim. cellForRowAtIndexPath: Fonksiyonun içerisinde:

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 
} 

aslında iki hatalar var; Bunun yanlışlıkla kopyalanıp çoğaltılmadığını bilmiyorum. Bir sonraki hata (lar) prepareForSegue:sender: yöntemde şunlardır:

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 
    } 
} 

Yine, iki hata vardır; Ancak, bunun her ikisi de sceneDetail ve sceneName'un kullanıldığı için olduğuna inanıyorum. Objective-C'de olmayan (ya da rastlamadığım) dosyalarda plist okuma ve kullanma ile her yerde hatalar var gibi görünüyor. peşin

sayesinde

-KodInc

+0

"NSIndexPath" öğesinin "satır" ve "bölüm" özellikleri "UIKit" değil, "Foundation" olarak tanımlanmıştır. Dosyanıza 'import UIKit' eklemek bu sorunu çözüyor mu? – Jack

+0

@JackWu 'UIKit' önceden alınmış; İlk satır – KodInc

cevap

19

, başlangıçtaki sorunu çözmek gibi bir fonksiyon içinde kod koymak için: a içine kodunuzu hareket ettirerek bu çözebilir

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

teşekkürler. Bu orijinal soruna yardımcı oldu. Ancak, takip edilen hatalar elle düzeltilmek zorundaydı. Açıklamanızın neden yanlış yaptığımı sorduğunu açıklayabilir misiniz? Ayrıca, StackOverflow'a yöneltilmişse, eğer sorularımın cevabını hiçbir açıklama yapmadan verdiyse (bu cevapta olduğu gibi), kabul ediyorum mu? - KodInc – KodInc

1

Nesnelerinizin başlatılmasından sonra çağrılan işlev.

Özellikler, nesnenizin başlatılmasının bir parçası olarak başlatılır. Özellikleri olarak yol ve kural oluşturdunuz ve bunları başlatma gereksinimlerini karşılamayan kodlarla başlatmaya çalışıyorsunuz. Herhangi bir örnek yöntemleri çağrılamıyor

bir başlatıcı, bir örneğini özelliklerinin değerleri okumak veya başlatma ilk aşaması tamamlanana kadar bir değere olarak kendini ifade eder.

-Swift Programlama Dili - Başlatma - Güvenlik çek Ayrıca 4

, sadece istemek ve tamamen taşıyabilirsiniz böylece, özellikleri olması sceneName ve sceneDetail ihtiyaç görünüyor initialization sonra sceneDetail ve sceneName doldurmak için kullandığınız yöntem kapsamında.

Abonelik hatasının tam olarak ne anlama geldiğini söylemek zor tam olarak çünkü ne tür bir data detailVC.detailModal içermesi gerektiğini görmüyorum; Öyle olsa bile, yanlış nesne türü detailModal dizisine geçiriliyor gibi görünüyor. Bu sorunun küçük bir açıklaması Swift and arrays