Многоячейка TableView не работает, Завершена из-за сигнала 9 - PullRequest
0 голосов
/ 03 декабря 2018

Я хотел сделать, когда на вкладке нажимаем вызов api и заполняем tableView.Но в моем случае мне пришлось использовать несколько ячеек.

 up category (tab bar item)  -> category (1- cell) -> products (2- cell)
 up category (tab bar item)-> products (2- cell)

У меня есть две прототипа ячейки в tableView.Первая ячейка для шоу-категории.Вторая ячейка для шоу-продуктов.Когда категория щелкает, я перезагружаю таблицу, тогда я могу показать продукты.Но когда я показал продукты только 1 раз.Моя таблица недоступна.Я уверен, что я называю перезагрузить данные.Сообщение от отладчика: прекращено из-за сигнала 9 Вот мой код,

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    if let orderType = selectedOrderType
    {
        switch orderType
        {
            case OrderViewHelper.OrderType.Category:
                  return self.categories.count;
            case OrderViewHelper.OrderType.Menu:
                  return self.menus.count;
            case OrderViewHelper.OrderType.Product:
                  return self.products.count;
        }
    }
    return 0;
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
    var returnerCell = UITableViewCell();
    switch selectedOrderType!
    {
        case OrderViewHelper.OrderType.Category:
                let cell = tableView.dequeueReusableCell(withIdentifier: ViewCellStatics.TABLE_ORDER_VIEW_CELL, for: indexPath) as! CategoryTableViewCell;
                cell.lblCategoryId.text = self.categories[indexPath.row].Id;
                cell.lblCategoryName.text = self.categories[indexPath.row].Name;
                cell.lblCategoryId.isHidden = true;
                returnerCell = cell;
                break;
        case OrderViewHelper.OrderType.Menu:
            let cell = tableView.dequeueReusableCell(withIdentifier: ViewCellStatics.TABLE_PRODUCT_VIEW_CELL, for: indexPath) as! ProductsTableViewCell;
            cell.lblPrice.text = self.menus[indexPath.row].Price;
            cell.lblProductName.text = self.menus[indexPath.row].Name;
            cell.lblId.text = self.menus[indexPath.row].Id;
            cell.lblId.isHidden = true;
            cell.lblProductName.numberOfLines = 2;
            returnerCell = cell;
            break;
        case OrderViewHelper.OrderType.Product:
            let cell = tableView.dequeueReusableCell(withIdentifier: ViewCellStatics.TABLE_PRODUCT_VIEW_CELL, for: indexPath) as! ProductsTableViewCell;
            cell.lblPrice.text = self.products[indexPath.row].Price;
            cell.lblProductName.text = self.products[indexPath.row].Name;
            cell.lblId.text = self.products[indexPath.row].Id;
            cell.lblId.isHidden = true;
            cell.lblProductName.numberOfLines = 2;
            cell.addButton.Model = self.products[indexPath.row];
            cell.addButton.addTarget(self, action: #selector(addBasket(_:)), for: .touchUpInside);
            break;
    }
    return returnerCell;
}



private func getCategories(upperCategoryId : String)
    {
        var paramaters = [WebServiceParamater]();
        paramaters.append(WebServiceParamater(key: WebServiceVariableKeys.UPPER_CATEGORY, value: upperCategoryId));
        WebService().GetData(action: ActionNames.CATEGORIES, paramater: paramaters)
        {
            (objects) in
            if (objects == nil || objects?.count == 0) { return; }
            self.ClearModels(type: OrderViewHelper.OrderType.Category);
            DispatchQueue.main.sync
            {
                self.categories = JsonParser.ParseCategories(jsonArray: objects);
                self.tableOrders.reloadData();
            }
        }
    }

    private func getProducts(category : CategoryModel)
    {
        var paramaters = [WebServiceParamater]();
        paramaters.append(WebServiceParamater(key: WebServiceVariableKeys.CATEGORY, value: category.Id));
        WebService().GetData(action: ActionNames.PRODUCT, paramater: paramaters)
        {
            (objects) in
            if (objects == nil || objects?.count == 0) { return; }
            self.ClearModels(type: OrderViewHelper.OrderType.Product);
            DispatchQueue.main.sync
            {
                self.products = JsonParser.ParseProduct(jsonArray: objects);
                self.tableOrders.reloadData();
            }
        }
    }

Скриншоты

Категория

enter image description here

Я выбрал одну категорию, чтобы увидеть продукты

enter image description here

Перезагрузка данных не работает.

enter image description here

1 Ответ

0 голосов
/ 03 декабря 2018

Никогда вызов DispatchQueue.main.sync , вместо этого попробуйте DispatchQueue.main.async .

Кстати: убедитесь, что ваши методы в WebService вызывают асинхронно в фоновых потоках, чтобы вы не блокировали пользовательский интерфейс при загрузке чего-либо.

Надеюсь, этот ответ поможет вам в понимании https://stackoverflow.com/a/44324968/4304998

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...