基于对UIAlertView的响应,从UITableViewCell有条件地搜索导航

时间:2011-12-17 04:15:50

标签: uitableview ios5 uialertview storyboard

我的问题似乎是一般问题,但似乎无法找到答案。

我有一种情况,当用户点击自定义UITableViewCell时,我想显示一个警报,然后根据对警报的响应,保持在同一视图(用户选择取消)或显示另一个视图(如果用户选择继续)。我想使用故事板功能&塞格斯。

怎么会这样呢?你必须以老式的方式做到这一点吗?

3 个答案:

答案 0 :(得分:11)

@user,只需以旧时尚的方式创建alertView;我知道任何故事板功能,以不同的方式做到这一点。故事板可以帮助的是segues。您可以通过编程方式调用segues。使用警报视图取消按钮,您可以返回(即什么都不做)。对于另一个选项,要显示另一个视图,您可以以编程方式调用segue以转换到所需的视图。如果您在故事板上没有为某些其他原因定义了正确的segue,只需创建一个按钮并使用它来创建segue并为其命名。通过在故事板中单击它来命名segue,并使用属性检查器为其命名(标识符)。然后隐藏按钮或将其放在视图之外。我通常在工具栏上放置这些类型的按钮,并使用垫片将它们排除在视图之外。这是一些示例代码:

从警报视图委托中调用segue,如下所示:

[self performSegueWithIdentifier: @"done" sender: self];

同时实现此方法以执行任何必要的任务以准备segue:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"done"]) 
    {
        //    [[segue destinationViewController] setManagedObjectContext:self.managedObjectContext];
        //    [[segue destinationViewController] setSelectedClient:selectedClient];
    }
}

答案 1 :(得分:8)

您可以直接从startingViewController创建segues到多个destinationViewControllers,然后可以以编程方式“执行”。你不需要为它们创建任何隐藏的按钮,这看起来像是一个黑客。

答案 2 :(得分:4)

好的,我提出了一个与我喜欢的故事板保持一致的解决方案。

示例:

我的tableview有2个部分,分组,单元格是动态原型。第0节包含一行/ UITableViewCell&我不希望它发生变化。第1节包含我想要触发segue&的多个单元格。深入细节。

在故事板中:

  • 我删除了将tableviewcell链接到目标视图控制器的segue。
  • 我制作了一个'通用'segue,将源视图控制器直接链接到目标视图控制器。
  • 在segue的属性中,我设置了标识符('EditTimePeriod')并将类型设置为Push(我假设Modal的工作方式相同)。

在源视图控制器中:

  • 在prepareForSegue方法中,我处理了从我的UIBarButtonItem(Add)控制拖动的常见'AddTimePeriod'segue,以及'generic'(vc - > vc)'EditTimePeriod'segue。 / p>

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    
        // handle the click of the 'Add' bar button item    
        if([segue.identifier isEqualToString:@"AddTimePeriod"]) {
            TimePeriodViewController* tpvc = (TimePeriodViewController*)segue.destinationViewController;
            tpvc.delegate = self;
            // database & entity stuff for adding the new one to the mOC, etc
        }
    
        // handle the click of one of the 'editable' cells - 
        if([segue.identifier isEqualToString:@"EditTimePeriod"]) {
            TimePeriodViewController* tpvc = (TimePeriodViewController*)segue.destinationViewController;
            tpvc.delegate = self;
            TimePeriod * newTP = [self.timePeriodArray objectAtIndex:self.tableView.indexPathForSelectedRow.row];
            tpvc.timePeriod = newTP;
        }
    }   
    
  • 然后我实现了tableView:didSelectRowAtIndexPath方法,并将我的条件放在这里。如果所选行在零之外,我手动调用EditTimePeriod segue,将发件人定义为选定的tableviewcell:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    
        if(self.tableView.indexPathForSelectedRow.section!=0){
            [self performSegueWithIdentifier:@"EditTimePeriod" sender:[tableView cellForRowAtIndexPath:indexPath]];
        }
    
        [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
    
        return;    
    }
    

很高兴在第0部分对单元格进行编码,因此首先不能选择它! 希望这会有所帮助。

**然后5分钟后我又看了一眼并意识到我可以将第0部分的数据移动到部分标题中,这更直观,而且无论如何都没有被使用。将设计从每个tableviewcell中打开以获得标准segue,而无需任何条件/检查。无论如何,这是一个很好的运动:)