Я разрабатываю небольшое приложение на основе UITableView
в Swift. Я начал с жесткого кодирования некоторых базовых массивов как таковых (включая объявление базового класса и объявление выхода 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
. Я создал для этого plist под названием «Scenes.plist» и попытался заменить код. В Objective-C я бы сделал так:
NSString *path = [[NSBundle mainBundle] pathForResource:@"Scenes" ofType:@"plist"];
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path];
sceneName = [dict objectForKey:@"SceneName"];
sceneDetail = [dict objectForKey:@"SceneDetail"];
Я начал делать это в Swift следующим образом:
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
}
На самом деле есть две ошибки; Я не знаю, случайно ли это продублировано или нет. Следующие ошибки находятся в методе prepareForSegue:sender:
:
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
}
}
Опять две ошибки; однако я считаю, что это связано с тем, что используются sceneDetail
и sceneName
. Кажется, повсюду возникают ошибки при чтении и использовании plist в файлах, которых нет (или с которыми я не сталкивался) в Objective-C.
row
иsection
элементаNSIndexPath
определены вUIKit
, а не вFoundation
. Решит ли эту проблему добавлениеimport UIKit
в ваш файл? - person Jack   schedule 13.06.2014UIKit
уже импортирован; это первая линия - person virenabhyankar   schedule 14.06.2014