【问题标题】: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 的项目。

当我放松时,有什么方法可以知道这些信息?

【问题讨论】:

    标签: ios objective-c uiviewcontroller segue


    【解决方案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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-05
      • 1970-01-01
      • 2014-07-18
      • 1970-01-01
      • 2023-03-08
      • 2014-09-28
      • 2014-08-23
      • 1970-01-01
      相关资源
      最近更新 更多