表视图UI错误:Swift

时间:2015-06-14 11:35:35

标签: swift uitableview user-interface xcode6

关于我在动物表视图项目中询问代码错误的最后一个问题,现在我完成了初始编码,但我的UI变得非常奇怪。它缺少每个动物名称的第一个字母和表格视图原型单元格。 例如, amel 应该是camel而 hinoceros 应该是rhinoceros。 这是代码中的错误吗?

import UIKit

class AnimalTableViewController: UITableViewController {

var animalsDict = [String: [String]] ()
var animalSelectionTitles = [String] ()

let animals = ["Bear", "Black Swan", "Buffalo", "Camel", "Cockatoo", "Dog", "Donkey", "Emu", "Giraffe", "Greater Rhea", "Hippopotamus", "Horse", "Koala", "Lion", "Llama", "Manatus", "Meerkat", "Panda", "Peacock", "Pig", "Platypus", "Polar Bear", "Rhinoceros", "Seagull", "Tasmania Devil", "Whale", "Whale Shark", "Wombat"]

func createAnimalDict() {
    for animal in animals {
        let animalKey = animal.substringFromIndex(advance(animal.startIndex, 1))
        if var animalValues = animalsDict[animalKey] {
            animalValues.append(animal)
            animalsDict[animalKey] = animalValues
        } else {
            animalsDict[animalKey] = [animal]
        }
    }
    animalSelectionTitles = [String] (animalsDict.keys)
    animalSelectionTitles.sort({ $0 < $1})
    animalSelectionTitles.sort( { (s1:String, s2:String) -> Bool in
        return s1 < s2
    })
}

override func viewDidLoad() {
    super.viewDidLoad()

    createAnimalDict()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // Return the number of sections.
    return animalSelectionTitles.count
}

override func tableView(tableView: UITableView, titleForHeaderInSection section:Int)  -> String? {
    // Return the number of rows in the section.
    return animalSelectionTitles[section]

}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell

    let animalKey = animalSelectionTitles[indexPath.section]
    if let animalValues = animalsDict[animalKey] {
        cell.textLabel?.text = animalValues[indexPath.row]
        let imageFileName = animalValues[indexPath.row].lowercaseString.stringByReplacingOccurrencesOfString("", withString: "_", options: nil, range: nil)
        cell.imageView?.image = UIImage(named:imageFileName)
    }
    return cell
}

}

2 个答案:

答案 0 :(得分:1)

到目前为止,我可以说错误在您的createAnimalDict()方法中。在行

let animalKey = animal.substringFromIndex(advance(animal.startIndex, 1))

将第二个参数提前交换为0,因此它是:

let animalKey = animal.substringFromIndex(advance(animal.startIndex, 0))

事实上,我并不知道你想要做什么。

答案 1 :(得分:0)

在这种方法中:

override func tableView(tableView: UITableView, titleForHeaderInSection section:Int)  -> String? {
    // Return the number of rows in the section. (THIS COMMENT IS INCORRECT)
    return animalSelectionTitles[section]
}

您将返回每个部分的标题。但是,由于animalSelectionTitles[index]

中的构造,createAnimalDict包含没有第一个字母的动物名称

使用动物阵列代替提供完整的动物名称:

override func tableView(tableView: UITableView, titleForHeaderInSection section:Int)  -> String? {         
     return animals[section]
}

但是请注意,由于删除了第一个字母,您可能会有两只动物映射到同一个键,因此如果没有必要,请使用整个动物名称作为关键字。