表视图:禁用行或发出停止segue的警报?

时间:2012-05-22 13:12:54

标签: objective-c xcode uitableview

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

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

我尝试不在第二个视图中加载(第一个商店选择的)名称,但是我在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继续吗?

1 个答案:

答案 0 :(得分:1)

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

1。条件segue

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

据推测,你是从表格单元格开始在IB中制作一个segue?当你这样做时,你可以方便地不需要任何代码来执行segue(当你点击表格单元时它会自动完成),但是你也没有对它进行任何运行时控制。

如果您需要以编程方式控制是否/何时/哪个segue要执行,您应该从视图控制器本身(而不是从其中的控件)开始创建segue,并在IB中为segue提供唯一标识符。然后,在tableView:didSelectRowAtIndexPath:实施中,一旦您知道要执行segue,就可以致电[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]应该做到这一点。