NSIndexPath?在Swift中没有成员名称'row'错误

时间:2014-06-04 14:36:23

标签: ios swift uitableview

我正在使用Swift语言和方法

创建一个UITableViewController
override 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?

4 个答案:

答案 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)

您可以为此调用使用可选的链接语法(如果nilindexPath,则将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