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
"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
@JackWu 'UIKit' önceden alınmış; İlk satır – KodInc