2013-05-29 29 views
4

我在我的WishlistVC(一个列出了所有愿望清单的VC)中有一个展开顺序。现在,这个VC允许用户点击愿望清单,如果它是空的,调出EditWishlistItems VC,以便可以选择将哪些项目放入该愿望清单中。 WishlistVC还有另一个按钮,允许用户创建新的心愿单,然后调用EditWishlistItems,以便用户可以将项目添加到新心愿单。 这些对于同一个VC来说都是不同的阶段。如何找出哪个segue在unwind segue中被称为目的地?

当我放松时,我想知道是谁调用了EditWishlistItems VC,也就是说我在展开顺序中继续执行哪个轮回。如果它来自addItemsToWishlist modal segue,那么我想将心愿单添加到Core Data中,并且如果它来自editWishlistItems modal segue,那么我想要编辑CD中心愿单的项目。

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

回答

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

然后,当我们放松,我们检查,看看是否BOOLYESNO

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

然后你的按钮链接到那些方法,而不是直接进行塞格斯

最后

-(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交互。

+0

'viewDidAppear'是一个坏主意。这会在很多情况下再次被调用,例如用户切换应用程序并返回,或者解除模态显示的视图控制器。 –

相关问题