如何使数组中的元素组合并快速显示在tableView上

时间:2018-11-13 09:44:52

标签: ios arrays swift uitableview

我有一个像这样的数组:-

var priceArray = [0, 200, 400, 600, 800, 1000]

我从应用程序中的Api获得了这些数据。而且我正在使用tableView显示数据,因此我可以提供以下价格选择:-

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return priceArray.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "stickCell", for: indexPath) as! StcikCell
    cell.priceLabel.text = "\(priceArray[0]) - \(priceArray[1])"
    return cell
}

但是问题是我是否会使用此

cell.priceLabel.text = "\(priceArray[0]) - \(priceArray[1])" 

我只会在tableView中获得第一个和第二个值,但是我真正想要的是在第一行中我想要获得0 - 200,然后在第二行200 - 400中获得第三{{1 }},直到得到400 - 600的组合。我怎样才能做到这一点。请帮忙吗?

6 个答案:

答案 0 :(得分:2)

您需要使用indexPath.rowpriceArray中的cellForRowAt编制索引,并且还需要修改numberOfRowsInSection,因为价格范围比{{1 }}。

priceArray

答案 1 :(得分:1)

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return (priceArray.count - 1)
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "stickCell", for: indexPath) as! StcikCell
    let index = indexPath.row
    cell.priceLabel.text = "\(priceArray[index]) - \(priceArray[index + 1])"
    return cell
}

这应该可以完成工作。

答案 2 :(得分:1)

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return priceArray.count - 1
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "stickCell", for: indexPath) as! StcikCell


    cell.priceLabel.text = "\(priceArray[indexPath.row]) - \(priceArray[indexPath.row + 1])"


        return cell
    }

答案 3 :(得分:1)

您的价格数组包含6个元素。但您需要5个价格范围。 因此,您需要从numberOfRowsInSection减去1,这将给您5个元素。

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){

            audioAttributes = new AudioAttributes.Builder()
                    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                    .setUsage(AudioAttributes.USAGE_GAME)
                    .build();

            soundPool = new SoundPool.Builder()
                    .setAudioAttributes(audioAttributes)
                    .setMaxStreams(2)
                    .build();
        }else{
            soundPool = new SoundPool(2, AudioManager.STREAM_MUSIC,0);
        }

答案 4 :(得分:1)

您可以简单地创建用于为tableView创建dataSource数组的函数:

func makeTableDataSource(from priceArray: [Int]) -> [String] {
    var resultArray = [String]()

    for (index, price) in priceArray.enumerated() where index < priceArray.count - 1 {
        resultArray.append("\(price) - \(priceArray [index + 1])")
    }

    return resultArray
}

结果:

    var priceArray = [0, 200, 400, 600, 800, 1000]

    Result:
    - 0 : "0 - 200"
    - 1 : "200 - 400"
    - 2 : "400 - 600"
    - 3 : "600 - 800"
    - 4 : "800 - 1000"

    var priceArray = [0, 200, 400]

    Result:
    - 0 : "0 - 200"
    - 1 : "200 - 400"

    var priceArray = [0]

    Result:
    []

之后,只需创建private var tableViewDataSource = [String]()之类的属性 然后在您的viewDidLoad()中添加:

override func viewDidLoad() {
    super.viewDidLoad() 
    var priceArray = [0, 200, 400, 600, 800, 1000] 
    tableViewDataSource = makeTableDataSource(from: priceArray)
}

在您的情况下很容易使用:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return tableViewDataSource.count 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "stickCell", for: indexPath) as! StcikCell
    cell.priceLabel.text = tableViewDataSource[indexPath.row]
    return cell
}

这种方法的优点:

  • 打开viewController时,您只能创建一次数据源
  • 您的单元的数据源无法“即时”生成
  • 生成tableDataSource数据的单一责任(如果您需要更新字符串,则只需要在makeTableDataSource中进行操作,其他一切都可以正常工作)
  • 容易发现的潜在错误
  • 所有表的单个“真实数据”(在不同情况下不需要使用array.count - 1array.count + 1,因此可能发生崩溃的位置更少)
  • 您当然可以重用此功能:)

祝您编程愉快!

答案 5 :(得分:1)

您所需要做的就是正确准备数据源。
为此,我建议将现有价格数组拆分为多个块并将其映射到您要表示的对象。您的情况是字符串类型。
您可以使用以下扩展名:

extension Sequence {
func split(by chunkSize: Int) -> [[Self.Element]] {
    return self.reduce(into:[]) { memo, cur in
        if memo.count == 0 {
            return memo.append([cur])
        }
        if memo.last!.count < clump {
            memo.append(memo.removeLast() + [cur])
        } else {
            memo.append([cur])
        }
    }
}
}

用法:

var priceArray = [0, 200, 400, 600, 800, 1000]
let dataSource = priceArray.split(by: 2).map { "\($0[0]) - \($0[1])" }
// result: ["0 - 200", "400 - 600", "800 - 1000"]