0

我有两个表格视图填充了他们的 viewDidLoad,其中的数据来自包含商店名称的 sqllite db。在第一个视图中我选择一个元素(即一个商店),然后在第二个视图中我必须选择另一个与第一个不同的商店。

我可以在填充后禁用第二个表格视图的行之一吗?

我尝试不在第二个视图中加载(选择的第一家商店的名称),但我在其 viewDidLoad 中填充表格视图,不幸的是,在 viewDidAppear 和那一刻为时已晚,无法填满表格视图。

我还尝试以这种方式在第二个视图中选择一行的事件中添加警报

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
   NSString *choosenSecondShop= [secondShop objectAtIndex:indexPath.row];
   NSString* nameFirstShop = [function loadFirstShopChoosen]; 

   if ([choosenSecondShop isEqualToString:nameFirstShop]) {
       NSString *message=@"Second shop cannot match the first";
       alert = [[UIAlertView alloc] initWithTitle:@"Errore"
            message: message
            delegate: self cancelButtonTitle: @"Ok" 
            otherButtonTitles:nil, 
            nil];
       [alert show];
    }else {
        // go on with the app's stuff!
    }
}

但在这种情况下,会显示警报,但也会显示 segue。我可以阻止segue继续吗?

4

1 回答 1

1

有几种不同的方法可以解决这个问题:

1. 条件转场

这应该可行,尽管我不确定从用户体验的角度来看这是一个好主意。

大概您从表格单元格开始在IB中进行了segue?当你这样做时,你不需要任何代码来执行segue(当你点击表格单元格时它会自动完成),但你也没有对其进行任何运行时控制。

如果您需要对是否/何时/执行哪个 segue 进行编程控制,您应该从视图控制器本身(而不是从其中的控件)开始创建一个 segue,并在 IB 中为 segue 提供一个唯一标识符。然后,在您的实现中,一旦您知道要执行 segue tableView:didSelectRowAtIndexPath:,就可以调用。[self performSegueWithIdentifier:@"myIdentifier"]

2.禁用单元格选择

为了防止选择特定的单元格,您的表格视图控制器可以实现tableView:willSelectRowAtIndexPath:返回nil您不希望用户选择的任何索引路径。

如果您这样做,您可能希望让用户清楚可以选择哪些行 - 您可以更改单元格在tableView:cellForRowAtIndexPath:.

3.不显示单元格

您说您正在填充表格视图viewDidLoad,但实际上并没有这样工作:表格视图通过在需要时调用您的数据源和委托方法来填充自己。如果您想防止数据集中的项目显示为表格中的单元格,您只需要更改数据源和委托方法的行为:

  • tableView:numberOfRowsInSection:应该返回比其他情况少一的数字
  • tableView:cellForRowAtIndexPath:应反映该项目的移除;就像是:

    MyShop *shop;
    if (indexPath.row < indexOfFirstShop)
        shop = [shops objectAtIndex:indexPath.row];
    else
        shop = [shops objectAtIndex:(indexPath.row + 1)];
    // then configure cell for the chosen shop
    

现在,如果您在第一次调用这些方法时不知道要隐藏哪一行,那么一旦获得该信息,您需要做的就是告诉表视图它需要再次调用它们:[self.tableView reloadData]应该做诡计。

于 2012-05-22T17:07:32.533 回答