UITableViewCells不会加载索引超出范围

时间:2017-06-16 02:11:54

标签: ios swift uitableview

我正在尝试从CloudKit加载一些数据以使用自定义单元格填充tableview,并且我很难获得数据。

当我将行数定义为CKRecord数组的计数时,tableview显示,但没有任何内容加载到它们中。它们只是正确间隔开来,以便图像在那里。此外,当我在let record = matches[indexPath.row]设置断点时,它不会触发。

但是,如果我将return matches.count更改为实际数字,则项目会在let record = matches[indexPath.row]崩溃  带有索引超出范围的错误。我想保留行数作为记录数组的计数,但这是实际执行调用tableview单元格的覆盖函数的唯一更改。

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

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


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

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

        let record = matches[indexPath.row]

        if let img = record.value(forKey: "Picture") as? CKAsset {
        cell.profileimg.image = UIImage(contentsOfFile: img.fileURL.path)

        }

        return cell
    }

感谢任何建议

更新 - 这是我加载模型的地方

 func loadModel() {

        let totalMatch = (defaults.object(forKey: "passedmatch") as! [String] )

        let predicateMatch = NSPredicate(format: "not (UserID IN %@)", totalMatch )


        ProfilesbyLocation = defaults.object(forKey: "Location") as! String

        let query = CKQuery(recordType: ProfilesbyLocation , predicate: predicateMatch )

        publicData.perform(query, inZoneWith: nil,completionHandler: ({results, error in

            print("loading")

            if (error != nil) {
                let nsError = error! as NSError
                print(nsError.localizedDescription)
                print ("error")

            } else {
                if results!.count > 0 {
                        DispatchQueue.main.async() {

                        self.tableView.reloadData()
                        self.refresh.endRefreshing()

                        print("refreshed")
                       }

                }
            }
            }
            )
        )}

4 个答案:

答案 0 :(得分:0)

听起来你没有打电话

tableview.reloadData()
异步数据进入后

。保持numberOfRowsInSection原样并确保当您的网络请求回来时您正在重新加载。应该这样做。

答案 1 :(得分:0)

如果您从后台线程(或队列)收到了数据,请确保在主线程(或队列)下更新UI元素时。试试这个:

import csv
import tensorflow as tf
from tensorflow.contrib.cloud.python.ops import bigquery_reader_ops
from tensorflow.contrib.lookup import KeyValueTensorInitializer, HashTable
from tensorflow.contrib.tensor_forest.client.random_forest import TensorForestEstimator
from tensorflow.contrib.tensor_forest.python.tensor_forest import ForestHParams
from tensorflow.python.training.input import string_input_producer

sess = tf.Session()

with open('event_classes.csv', mode='r') as infile:
    reader = csv.reader(infile)
    event_names, event_numbers = list(zip(*[(r[0], int(r[1])) for r in reader]))


def input_fn():
    # Create maps between event names and event numbers
    event_class_map = HashTable(KeyValueTensorInitializer(
        event_names, event_numbers, key_dtype=tf.string, value_dtype=tf.int64), int(0))
    reverse_event_class_map = HashTable(KeyValueTensorInitializer(
        event_numbers, event_names, key_dtype=tf.int64, value_dtype=tf.string), "Unknown")

    # Specify features to read
    features = {"time_{}".format(i): tf.FixedLenFeature([1], tf.string, default_value="") for i in range(4)}

    # Create a Reader.
    reader = bigquery_reader_ops.BigQueryReader(project_id="drivemode-com",
                                                dataset_id="temp_stephane",
                                                table_id="event_history",
                                                timestamp_millis=1497502522,
                                                num_partitions=1,
                                                features=features)

    # Populate a queue with the BigQuery Table partitions.
    queue = string_input_producer(reader.partitions())

    # Read and parse examples.
    row_id, examples_serialized = reader.read_up_to(queue, 100)
    examples = tf.parse_example(examples_serialized, features=features)

    # Process the Tensors example["name"], example["age"], etc...
    for i in range(4):
        col = "time_{}".format(i)
        examples[col] = event_class_map.lookup(examples[col])
    # event_class_map.init.run(session=sess)
    label = examples.pop("time_3")
    return examples, label


hparams = ForestHParams(num_classes=len(event_numbers), num_features=3, max_nodes=3, num_trees=1).fill()
estimator = TensorForestEstimator(hparams)
estimator.fit(input_fn=input_fn, steps=1)
tf.train.start_queue_runners(sess)
print sess.run(estimator.evaluate(input_fn=input_fn))

答案 2 :(得分:0)

这解决了我的问题。

首先,断开TableView的Delegate / DataSource与Interface Builder refer this image的连接。当您最终准备好匹配数组的数据时,请添加此数据。

`DispatchQueue.main.async {
    tableView.dataSource = self 
    tableView.delegate = self
    tableView.reloadData
}`

希望这有帮助。

答案 3 :(得分:0)

您的matches似乎不正确。致电func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int)之前 ,你应该检查你的matches

如果您仍然不确定。您可以使用字符串文字初始化matches并尝试。