关于
CreateUserView.xib
:你不需要在nib文件中放置一个
CreateUserViewController
对象。你需要将File's Owner占位符的自定义类设置为
CreateUserViewController
。然后,您需要将File's Owner的
view
输出连接到nib中的顶级视图。
关于
delegate
属性:UIViewController类没有自己的
delegate
属性。想法是将
delegate
属性添加到UIViewController子类中。代理提供了一种让您呈现的视图控制器将自定义信息传递回呈现视图控制器的方法。
为什么要这样做?考虑您发布的代码。我假设您有一个
UserListViewController
,它显示用户对象列表,并具有“创建新用户”按钮。当用户点击“创建新用户”按钮时,您会创建一个
CreateUserViewController
并将其呈现。
用户与
CreateUserViewController
交互以设置新用户对象的属性-名称、等级、发型等。然后他点击“完成”按钮。您的
CreateUserViewController
创建新的User对象并将其放入数据库中。然后它需要解除自身,以便
UserListViewController
的用户对象列表再次出现。
但是,您希望用户列表包括新创建的用户对象,并且希望滚动列表,使新用户在屏幕上显示。因此,您需要一种方法让
CreateUserViewController
告诉
UserListViewController
有关新创建的用户对象。这就是代表的作用。
您可以像这样定义协议:
@protocol CreateUserViewControllerDelegate
- (void)didCreateUser:(User *)user;
@end
你需要给 CreateUserViewController
添加一个 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];
}
在你的中,你需要采用并实现以下协议:
@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];
}
CreateUserView
中发布你自定义的-initWithNibName:bundle:keyWrapper:
方法的代码? - Jason Coco