首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TableView多个单元不工作,由于信号9而终止

TableView多个单元不工作,由于信号9而终止
EN

Stack Overflow用户
提问于 2018-12-03 21:10:37
回答 1查看 85关注 0票数 1

我想让tabbaritem点击call api并填充tableView。但在我的例子中,我不得不使用多个cell。

代码语言:javascript
复制
 up category (tab bar item)  -> category (1- cell) -> products (2- cell)
 up category (tab bar item)-> products (2- cell)

我在tableView中有两个原型单元。显示类别的第一个单元格。第二个单元格用于显示产品。当分类点击时,我重新加载了tableview,然后我就可以显示产品了。但是当我只展示了一次产品时。我的表视图不可用。我确定我调用了reload data。来自调试器的消息:由于信号9而终止这是我的代码,

代码语言:javascript
复制
 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();
            }
        }
    }

截图

类别

我点击了一个类别,这样就可以看到产品了

重新加载数据不起作用。

EN

回答 1

Stack Overflow用户

发布于 2018-12-03 21:24:19

DispatchQueue.main.sync,请尝试调用DispatchQueue.main.async。

顺便说一句:确保WebService中的方法在后台线程中异步调用,这样就不会在加载东西时阻塞UI。

我希望这个答案能帮助你理解https://stackoverflow.com/a/44324968/4304998

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53594553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档