如何在展开的转场中找出哪个转场称为目的地?
Posted
技术标签:
【中文标题】如何在展开的转场中找出哪个转场称为目的地?【英文标题】:How do I find out which segue called the destination in an unwind segue? 【发布时间】:2013-05-29 20:57:02 【问题描述】:我在我的WishlistVC
(一个列出所有愿望清单的 VC)中有一个放松的 segue。现在,这个 VC 允许用户点击愿望清单,如果它是空的,请调出EditWishlistItems
VC,以便选择要放入该愿望清单中的项目。 WishlistVC 还有另一个按钮,允许用户创建新的心愿单,然后调用EditWishlistItems
以便用户可以将项目添加到新的心愿单。 对于同一个 VC,这两者是不同的。
当我放松时,我想知道是谁调用了EditWishlistItems
VC,即我在放松转场中执行了哪个转场。如果是来自addItemsToWishlist
modal segue,那么我想将wishlist 添加到Core Data,如果它来自editWishlistItems
modal segue,我想在CD 中编辑wishlist 的项目。
当我放松时,有什么方法可以知道这些信息?
【问题讨论】:
【参考方案1】:我会通过添加属性来做到这一点
@property (nonatomic, strong) NSString *recentSegue;
然后创建
-(void)addItemsToWishList:
//business logic
self.recentSegue = @"addItems";
[self performSegueWithIdentifier:@"EditWishlistItems" sender:self];
-(void)editWishListItems:
//business logic
self.recentSegue = @"editItems";
[self performSegueWithIdentifier:@"EditWishlistItems" sender:self];
然后将您的按钮链接到这些方法,而不是直接执行 segues
最后
-(void)viewDidAppear:(BOOL)animated
[super viewDidAppear:animated];
if(self.recentSegue)
if(self.recentSegue isEqualToString:@"addItems")
//do Whatever
else if(self.recentSegue isEqualToString:@"editItems")
//do whatever else
self.recentSegue = nil;
虽然这应该可行,但根据您的设计,另一种可能更好的方法是让 EditWishListItems 直接处理 coredata 交互。
【讨论】:
viewDidAppear
是个坏主意。在许多情况下会再次调用它,例如用户切换应用程序并返回,或者关闭模态呈现的视图控制器。【参考方案2】:
THE_DOM 的回答很好,但这就是我解决问题的方法。
要查看我们是否需要模态分割,我们在下面的委托方法中检查我们的愿望清单中是否没有项目。如果没有,我们告诉它继续。如果确实有项目,则推送 segue 将自动被调用(在 IB 中设置)。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
Wishlist *wishlist = [self.fetchedResultsController objectAtIndexPath:indexPath];
if([wishlist.items count] == 0)
// execute our segue
[self performSegueWithIdentifier:@"editWishlistItems" sender:self];
在我们的prepareForSegue
中,我们设置了一个BOOL
来指示用户点击了一个空心愿单(这是在我们的目标VC 中)。
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
... // other segues
if([segue.identifier isEqualToString:@"editWishlistItems"])
UINavigationController *navigationVC = (UINavigationController *)segue.destinationViewController;
ManageWishlistItemCDTVC *manageWishlistItemVC = (ManageWishlistItemCDTVC *)navigationVC.topViewController;
manageWishlistItemVC.tappedOnEmptyWishlist = YES;
manageWishlistItemVC.wishlist = [self.fetchedResultsController objectAtIndexPath:indexPath];
然后,当我们放松时,我们检查BOOL
是YES
还是NO
。
- (IBAction)saveWishlistItem:(UIStoryboardSegue *)segue
ManageWishlistItemCDTVC *manageWishlistItemVC = (ManageWishlistItemCDTVC *)segue.sourceViewController;
// check to see if we came from edit segue or add segue
if(manageWishlistItemVC.tappedOnEmptyWishlist) // edit segue
// saved edited wishlist
else // add segue
if([manageWishlistItemVC.selectedItems count] > 0)
// save new wishlist
【讨论】:
以上是关于如何在展开的转场中找出哪个转场称为目的地?的主要内容,如果未能解决你的问题,请参考以下文章
如何在多个 .xib 文件之间执行展开转场(不使用情节提要)