Относительно CreateUserView.xib
: вы не хотите помещать объект CreateUserViewController
в перо.Вы хотите установить для пользовательского класса заполнителя владельца файла значение CreateUserViewController
.Затем вам нужно подключить выход view
Владельца файла к представлению верхнего уровня в кончике.
Относительно свойства delegate
: класс UIViewController
не имеет своего собственного delegate
имущество.Идея состоит в том, что вы добавляете свойство delegate
к своему подклассу UIViewController
.Делегат предоставляет способ для вашего представленного контроллера представления передавать пользовательскую информацию обратно в представляющий контроллер представления.
Зачем вам это нужно?Давайте рассмотрим код, который вы разместили.Я предполагаю, что у вас есть UserListViewController
, который показывает список объектов пользователя и имеет кнопку «Создать нового пользователя».Когда пользователь касается кнопки «Создать нового пользователя», вы создаете CreateUserViewController
и представляете его.
Пользователь взаимодействует с CreateUserViewController
, чтобы установить атрибуты нового объекта пользователя - имя, ранг,прическа и т. д. Затем он нажимает кнопку «Готово».Ваш CreateUserViewController
создает новый объект User и помещает его в базу данных.Затем он должен сам себя закрыть, поэтому список пользовательских объектов UserListViewController
появится снова.
Но вы хотите, чтобы список пользователей включал только что созданный пользовательский объект, и вы хотите прокрутить список так, чтобыновый пользователь на экране.Поэтому вам нужен способ, чтобы ваш CreateUserViewController
сообщил UserListViewController
о вновь созданном объекте User.Вот где приходит делегат.
Вы определяете протокол следующим образом:
@protocol CreateUserViewControllerDelegate
- (void)didCreateUser:(User *)user;
@end
, и вы присваиваете свойству CreateUserViewController
a delegate
:
@interface CreateUserViewController
@property (weak, nonatomic) id<CreateUserViewControllerDelegate> delegate;
// ...
Когда вы нажимаете кнопку «Готово» CreateUserViewController
, вы уведомляете своего делегата о новом Пользователе:
- (IBAction)doneButtonWasTouched:(id)sender {
User *user = [self createUser];
[self.delegate didCreateUser:user];
[self dismissViewControllerAnimated:YES completion:nil];
}
В вашем UserListViewController
вы принимаете и внедряете протокол:
@interface UserListViewController <CreateUserViewControllerDelegate, UITableViewDelegate, UITableViewDataSource>
// ...
@end
@implementation UserListViewController
- (void)didCreateUser:(User *)user {
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[self.users count] inSection:0];
[self.users addObject:user];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation: UITableViewRowAnimationAutomatic];
[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition: UITableViewScrollPositionNone animated:YES];
}
и когда вам нужно представить CreateUserViewController
, вы устанавливаете делегату нового контроллера значение UserListViewController
:
- (IBAction)createUserButtonWasTouched:(id)sender {
CreateUserViewController *createUserController = [[CreateUserViewController alloc] initWithNibName:@"CreateUserView" bundle:[NSBundle mainBundle] keyWrapper:keyChainWrapper];
createUserController.delegate = self;
[self presentViewController:createUserController animated:YES completion:nil];
}