如何在放松segue中找出哪个segue称为目的地?

时间:2013-05-29 20:57:03

标签: ios objective-c uiviewcontroller segue

我在WishlistVC(一个列出所有愿望清单的VC)中有一个展开segue。现在,这个VC允许用户点击心愿单,如果它是空的,则调出EditWishlistItems VC,这样就可以选择将哪些项目放在心愿单中。 WishlistVC还有另一个按钮,允许用户创建新的愿望清单,然后调用EditWishlistItems,以便用户可以将项目添加到新的愿望清单。 这两者都是同一VC的不同部分。

当我放松的时候,我想知道是谁调用了EditWishlistItems VC,即我在unwind segue中执行了哪个segue。如果它来自addItemsToWishlist模态segue,那么我想将心愿单添加到核心数据,如果它来自editWishlistItems模态segue,我想编辑愿望清单中CD的项目。

放松时,有什么方法可以了解这些信息吗?

2 个答案:

答案 0 :(得分:6)

我会通过添加属性

来实现
@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交互。

答案 1 :(得分:1)

THE_DOM的答案很好,但这就是我解决问题的方法。

要查看我们是否需要进行模态划分,我们会在以下委托方法中检查并查看我们的愿望清单中是否包含任何项目。如果没有,我们告诉它要塞。如果它确实有项目,则会自动调用push 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
    }
}