问题
I wonder if anybody can explain the difference between using a unwind segue and using delegation in the example I have below:
I have a FriendsTableViewController
populated by an array
of friends and another AddFriendTableViewController
with a function to add a friend
to the FriendsTableViewController
.
This is how I send the data from my AddFriendViewController
with a 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];
}
}
This is how I add the data from the AddFriendTableViewController
to the array
in FriendsTableViewController
with the unwind 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];
}
}
Now this works as I want so I hope I'm not breaking any stackoverflow rules or offending anyone, but I just wanted to know what is the difference between the way my example code is used and if the same scenario was made but with custom delegate methods for the AddFriendViewController
. If some can explain it would be great!
回答1:
Using an unwind segue is very similar to having a delegate, with the following advantages:
- You don't need to implement any dismiss logic
- You don't need to pass references up and down the navigation stack
- You don't need to declare a delegate protocol
- It's trivial to unwind back a number of stages in your app
The disadvantages are
- Dependent on using storyboards (which may hamper reusability)
- If there are a lot of them, it can lead to the same messiness as you can get in
prepareForSegue
with a lot of branching off identifier names - If you decide to present the view controller via some other method (not a segue) then you can't unwind back from it
The code you have looks good. I'd stick with it.
来源:https://stackoverflow.com/questions/23633574/difference-between-unwind-segue-and-delegation