微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swift:设置单元格文本标签时无法摆脱“可选”

我花了很多时间试图解决这个问题,但我没有快乐.

我有一个在我的appDelegate中创建的数组(levelArrayName),它由一个sqlite数据库填充:

class AppDelegate: UIResponder,UIApplicationDelegate {

var window: UIWindow?
var database:copaquePointer = nil
var levelArray: [[Int]] = []
var levelArrayName: [[String]] = []

func checkdatabase(){
    //check is database exist at path.....
    var dirPaths:Nsstring

    dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,.UserDomainMask,true)[0] as! Nsstring;

    let databasePath = dirPaths.stringByAppendingString("/rugby.sqlite")
    let dbpath = databasePath.cStringUsingEncoding(NSUTF8StringEncoding)

    let filemanager = NSFileManager.defaultManager()

    if (!filemanager.fileExistsAtPath(databasePath))
    {
        let fileForcopy = NSBundle.mainBundle().pathForResource("rugby",ofType:"sqlite")
        filemanager.copyItemAtPath(fileForcopy!,toPath:databasePath,error: nil)
    }

    let error = sqlite3_open(dbpath!,&database)
    if error != sqlITE_OK
    {
        println("error while opening");
        sqlite3_close(database);
    }

}


func getLevels() {
    var selectQuery="SELECT * FROM level"
    var stmt:copaquePointer = nil
    var result = sqlite3_prepare_v2(database,selectQuery,-1,&stmt,nil);

    if result != sqlITE_OK
    {
        println("Failed  \(sqlite3_errmsg(database))")
        println("Failed  \(sqlite3_errcode(database))")
    }
    else
    {
        result = sqlite3_step(stmt)

        while result == sqlITE_ROW {

            var levelID = Int(sqlite3_column_int(stmt,0))
            var attackID = Int(sqlite3_column_int(stmt,2))
            var defenceID = Int(sqlite3_column_int(stmt,2))
            var runs = Int(sqlite3_column_int(stmt,3))
            var tries = Int(sqlite3_column_int(stmt,4))
            var name_buf = sqlite3_column_text(stmt,5)
            var name = String.fromCString(UnsafePointer<CChar>(name_buf))

            result = sqlite3_step(stmt)

            self.levelArray += [[levelID,attackID,defenceID,runs,tries]]
            self.levelArrayName += [["\(name)"]]
        }
    }

}

然后我在我的一个tableviewcontrollers中使用这个数组来设置单元格标签

import Foundation
import UIKit

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

class LevelsViewController: UITableViewController,UITableViewDelegate,UITableViewDataSource {


var levelArrayName = appDelegate.levelArrayName

override func viewDidLoad() {
    super.viewDidLoad()



    self.tableView.registerClass(UITableViewCell.self,forCellReuseIdentifier: "cell")
}

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

override func tableView(tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
    return appDelegate.levelArray.count
}

override func tableView(tableView: UITableView,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("LevelCell",forIndexPath: indexPath) as! UITableViewCell

    cell.textLabel?.text = levelArrayName[indexPath.row][0]

    return cell

    //return UITableViewCell()


}

但是,单元格标签在数组中的字符串之前显示“Optional:”.

我已经尝试解开appDelegate.levelArrayName,但我似乎无法让它工作.

我敢肯定我错过了一些简单的东西,但是我希望能指出正确的方向.

谢谢

解决方法

您需要在数组中的索引处解包该元素

if let text = levelArrayName[indexPath.row][0] {
    cell.textLabel?.text = text
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐