关于CreateUserView.xib
:你不想把一个CreateUserViewController
对象放在笔尖上。您想要将文件所有者占位符的自定义类设置为CreateUserViewController
。然后,您需要将文件所有者的出口连接到笔尖的顶层视图。
关于delegate
财产:UIViewController
类没有自己的delegate
属性。这个想法是,你添加一个delegate
属性到你的子类UIViewController
。委托为您呈现的视图控制器提供了一种方式将自定义信息传递回呈现视图控制器。
你为什么要这么做?我们来考虑你发布的代码。我假设你有一个UserListViewController
显示用户对象列表,并有一个“创建新用户”按钮。当用户触摸“创建新用户”按钮时,您将创建一个CreateUserViewController
并显示它。
用户与CreateUserViewController
进行交互以设置新用户对象的属性 - 名称,等级,发型等等。然后他触摸一个“完成”按钮。您的CreateUserViewController
创建新的用户对象并将其放入数据库中。然后它需要自行解散,所以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];
}
在你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];
}
你能后的代码在'CreateUserView'上自定义'-initWithNibName:bundle:keyWrapper:'方法? – 2012-01-30 02:46:00
我添加它来发布。谢谢 – Nick 2012-01-30 02:54:07