【发布时间】:2012-01-22 11:22:32
【问题描述】:
我的问题似乎是一个通用问题,但似乎找不到答案。
我有一种情况,当用户点击自定义 UITableViewCell 时,我想显示一个警报,然后根据对警报的响应,要么留在同一个视图上(用户选择取消),要么显示另一个视图(如果用户选择继续)。我想使用故事板功能和转场来做到这一点。
如何解决这个问题?你必须用老式的方式来做这件事吗?
【问题讨论】:
标签: uitableview ios5 uialertview storyboard
我的问题似乎是一个通用问题,但似乎找不到答案。
我有一种情况,当用户点击自定义 UITableViewCell 时,我想显示一个警报,然后根据对警报的响应,要么留在同一个视图上(用户选择取消),要么显示另一个视图(如果用户选择继续)。我想使用故事板功能和转场来做到这一点。
如何解决这个问题?你必须用老式的方式来做这件事吗?
【问题讨论】:
标签: uitableview ios5 uialertview storyboard
@user,用旧的方式创建 alertView;我确实知道任何故事板功能可以以不同的方式执行此操作。故事板可以提供帮助的地方是 segues。您可以以编程方式调用 segue。使用警报视图取消按钮,您可以返回(即什么也不做)。对于另一个选项,要显示另一个视图,您可以以编程方式调用 segue 以转换到所需的视图。如果由于其他原因在情节提要上没有定义正确的转场,只需创建一个按钮并使用它来创建转场并命名。通过在情节提要中单击它来命名 segue,并使用属性检查器为其命名(标识符)。然后隐藏按钮或将其置于视图之外。我通常将这些类型的按钮放在工具栏上,并使用垫片将它们挡在视图之外。下面是一些示例代码:
从警报视图委托中调用 segue,如下所示:
[self performSegueWithIdentifier: @"done" sender: self];
也实现这个方法来做任何必要的任务来准备转场:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"done"])
{
// [[segue destinationViewController] setManagedObjectContext:self.managedObjectContext];
// [[segue destinationViewController] setSelectedClient:selectedClient];
}
}
【讨论】:
您可以直接从startingViewController 到多个destinationViewControllers 创建segues,然后可以以编程方式“执行”。您不需要为它们创建任何隐藏按钮,这看起来确实像个 hack。
【讨论】:
好的,我想出了一个与我喜欢的故事板保持一致的解决方案。
例子:
我的表格视图有 2 个部分,分组,单元格是动态原型。第 0 节包含一行/UITableViewCell & 我不希望它继续。第 1 部分包含多个单元格,我想触发转场并深入了解细节。
在故事板中:
在源视图控制器中:
在 prepareForSegue 方法中,我处理了从 UIBarButtonItem(添加)控制拖动的常见“AddTimePeriod”转场以及“通用”(vc-->vc)“EditTimePeriod”转场。
- (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。无论如何,这是一个很好的练习:)
【讨论】: