如何在展开的转场中找出哪个转场称为目的地?

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];
    

然后,当我们放松时,我们检查BOOLYES 还是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 文件之间执行展开转场(不使用情节提要)

如何在转场目标视图控制器中执行转场

iOS - 如何在 Unwind Segue 中控制动画类型?

是否可以在情节提要中定义“通用”展开转场?

即时转场,在呈现视图之前

Vegas怎么设置转场特效中的关键帧动画?