我正在使用Swift语言和方法
创建一个UITableViewControlleroverride func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath?) -> UITableViewCell?
我收到此错误
NSIndexPath?在Swift中没有成员名称'row'错误
我不明白为什么。
这是我的代码
import UIKit
class DPBPlainTableViewController: UITableViewController {
var dataStore: NSArray = NSArray()
override func viewDidLoad() {
super.viewDidLoad()
self.dataStore = ["one","two","three"]
println(self.dataStore)
}
// #pragma mark - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView?) -> Int {
// Return the number of sections.
return 1
}
override func tableView(tableView: UITableView?, numberOfRowsInSection section: Int) -> Int {
// Return the number of rows in the section.
return self.dataStore.count
}
override func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath?) -> UITableViewCell? {
let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell")
cell.textLabel.text = self.dataStore[indexPath.row]
return cell
}
}
然后,如何使用数组dataStore元素设置cell.text?
答案 0 :(得分:15)
您可以使用indexPath
打开可选的if let...
参数:
if let row = indexPath?.row {
cell.textLabel.text = self.dataStore[row]
}
或者,如果您确定indexPath
不是nil
,则可以强制使用!
解包:
cell.textLabel.text = self.dataStore[indexPath!.row]
请记住,对于nil值的indexPath!
将是运行时异常,因此在第一个示例中打开它是一种更好的做法。
答案 1 :(得分:5)
您可以为此调用使用可选的链接语法(如果nil
为indexPath
,则将cell.textLabel.text设置为nil
):
cell.textLabel.text = indexPath? ? self.dataStore[indexPath!.row] : nil
或显式解包(如果indexPath为nil
则导致运行时错误):
cell.textLabel.text = self.dataStore[indexPath!.row]
或使用@NateCook建议的更详细的if let
语法。
答案 2 :(得分:0)
使用.item而不是.row
cell.textLabel.text = self.dataStore[indexPath.item]
答案 3 :(得分:-2)
访问NSIndexPath
的行和部分所需要做的就是导入文件的标头,其中定义了这些扩展到基础NSIndexPath
类。
如果不这样做,那么您的类就会像NSIndexPath
的实例上的行和节一样。
NSIndexPath
的行和部分扩展名在UITableView.h
内的UIKit框架内声明。
要解决此问题,您只需将UITableView.h
导入到您的课程中即可。就是这样。
这是在Objective-C中的UITableView.h中定义类扩展的地方。我确信斯威夫特也有类似的部分。
// This category provides convenience methods to make it easier to use an NSIndexPath to represent a section and row
@interface NSIndexPath (UITableView)
+ (instancetype)indexPathForRow:(NSInteger)row inSection:(NSInteger)section;
@property (nonatomic, readonly) NSInteger section;
@property (nonatomic, readonly) NSInteger row;
@end