2017-10-13 102 views
0

我在uiview控制器上使用两个按钮的选项卡栏来显示两个不同的tableview。如果正常使用,一切正常。使用两个表格和应用程序崩溃时出现竞态条件

但问题出现时,我滚动一个tableview,并立即点击按钮切换到第二个tableview。

我想由于竞争条件occor作为一个tableview不完成其过程,我开始了第二个过程。

有没有解决这个问题的方法。

@IBOutlet var tableViewCase: UITableView! 
@IBOutlet var tableViewInsp: UITableView! 
@IBOutlet var tabBar: UITabBar! 

var selectedTableView:UITableView! 

func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) 
{ 
    if item.tag == TAB_BAR_CASES { 
     app?.settings.lastSelectedInboxTab = ACTIVITY_KIND_CASE 
     selectedTableView = tableViewCase 
     presenter.refresh() 

     self.view.bringSubview(toFront: tableViewCase) 
     showSelectedTableView() 
    } 
    else if item.tag == TAB_BAR_INSP { 
     app?.settings.lastSelectedInboxTab = ACTIVITY_KIND_INSP 
     selectedTableView = tableViewInsp 

     presenter.refresh() 

     self.view.bringSubview(toFront: tableViewInsp) 
     showSelectedTableView() 
    } 
    refreshTable(selectedTableView) 
} 
+0

请将相关的代码添加到这个问题。 – joern

+0

发生这种情况的原因是,在滚动正在进行时您正在更改数据源数组,因此它将尝试访问数据行中的数据源数组,导致崩溃 –

+0

@jon Snow。是的,现在正在发生。有没有解决方案来处理这种情况。 –

回答

0

在UITableView的委托函数中,如果您根据tableView的实例不处理,这是可能的。例如,处理这应该帮助:在继续之前

func numberOfSections(in tableView: UITableView) -> Int { 
    if(tableView == myTableView1) { 
    return myTableview1DataSourceRowCountVariable 
    } 
    else if(tableView == myTableView2) { 
    return myTableview2DataSourceRowCountVariable 
    } 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
{ 
    if(tableView == myTableView1) { 
    return myTableview1SectionCountVariable 
    } 
    else if(tableView == myTableView2) { 
    return myTableview2SectionCountVariable 
    } 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    if(tableView == myTableView1) { 
    return PrepareMyCellForTableView1() 
    } 
    else if(tableView == myTableView2) { 
    return PrepareMyCellForTableView2() 
    } 
} 

通过这种方式,它会首先认识上其表视图与数据源上指数这是工作的。