展开segue和委托之间的区别

时间:2014-05-13 14:07:21

标签: ios objective-c xcode delegates uistoryboardsegue

我想知道是否有人可以解释在下面的示例中使用展开segue和使用委托之间的区别:

我有一个由FriendsTableViewController朋友填充的array和另一个AddFriendTableViewController,其中包含friend添加FriendsTableViewController的功能。

这是我通过AddFriendViewController发送unwind segue数据的方式:

#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Check whether the Done button was tapped.
    // If it wasn’t, instead of saving the friend, the method returns without doing anything else.
    if (sender != self.doneButton) return;

    // See whether there’s text in the text field.
    if (self.nameTextField.text.length > 0) {
        // If there’s text, create a new friend and give it's properties the input from the text fields.
        self.friend = [[Friend alloc] initWithName:self.nameTextField.text
                                          dateOfBirth:self.birthdayDatePicker.date
                                        numberOfGifts:0];
    }
}

这是我使用AddFriendTableViewControllerarray中的数据添加到FriendsTableViewControllerunwind segue action的数据:

#pragma mark - Actions

- (IBAction)unwindSegue:(UIStoryboardSegue *)segue
{
    // Retrieve the source view controller, the controller that is unwinding from.
    AddFriendTableViewController *soruce = [segue sourceViewController];

    // Retrieve the soruce view controller’s friend object.
    Friend *friend = soruce.friend;

    // See whether the item exists.
    // If it’s nil, either the Cancel button closed the screen or the text field had no text, so you don’t want to save the item.
    if (friend != nil) {
        // If it does exist, add the item to the friends array.
        [self.friends addObject:friend];

        // Reload the data in the table.
        [self.tableView reloadData];
    }
}

现在这可以按照我的意愿运行,所以我希望我没有违反任何stackoverflow规则或冒犯任何人,但我只是想知道我的示例代码的使用方式和相同的方案之间的区别是什么但是使用AddFriendViewController的自定义委托方法。如果有人可以解释它会很棒!

1 个答案:

答案 0 :(得分:7)

使用展开segue与拥有委托非常相似,具有以下优点:

  • 您不需要实施任何解雇逻辑
  • 您无需在导航堆栈中上下传递引用
  • 您无需声明委托协议
  • 在应用程序中解开许多阶段是微不足道的

缺点是

  • 取决于使用故事板(可能妨碍可重用性)
  • 如果它们很多,它可能导致同样的混乱,因为prepareForSegue中有很多分支标识符名称
  • 如果您决定通过其他方法(不是segue)呈现视图控制器,那么您无法从中取消它

你的代码看起来不错。我坚持下去。