如果满足特定条件,我将尝试从另一个 ViewController 中打开一个 ViewController。代码似乎运行无误,但从未显示 View 。我是 xcode 4/ios 5 的新手,所以我一定遗漏了一些东西。
这是负责打开第二个 View Controller 的代码:
CreateUserViewController *createUserController = [[CreateUserViewController alloc] initWithNibName:@"CreateUserView" bundle:[NSBundle mainBundle] keyWrapper:keyChainWrapper];
[self presentViewController:createUserController animated:YES completion:nil];
在我的项目中,我有一个名为“CreateUserView”的 xib。我已经向这个 xib 添加了一个 View Controller 并将它分配给“CreateUserViewController”。
我还注意到在 apple 文档中显示设置要呈现的 viewcontroller 的委托(delegate)。但似乎 viewcontroller 对象上没有名为“delegate”的属性。这个文档是旧的吗?这是我尝试使用的文档(第 9-1 节):
有人可以给我提示吗?谢谢..
编辑 添加自定义构造函数
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil keyWrapper:(KeychainItemWrapper *)keyWrapper
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if(self){
[self setKeyChainWrapper:keyWrapper];
}
return self;
}
最佳答案
关于 CreateUserView.xib
:您不想在 nib 中放置一个 CreateUserViewController
对象。您想要将文件所有者占位符的自定义类设置为 CreateUserViewController
。然后,您需要将 File's Owner 的 view
导出连接到 nib 中的顶级 View 。
关于 delegate
属性:UIViewController
类没有自己的 delegate
属性。这个想法是您将 delegate
属性添加到 UIViewController
的子类。委托(delegate)为呈现的 View Controller 提供了一种将自定义信息传递回呈现 View Controller 的方法。
你为什么要这样做?让我们考虑一下您发布的代码。我假设您有一个显示用户对象列表的 UserListViewController
,并且有一个“创建新用户”按钮。当用户触摸“创建新用户”按钮时,您将创建一个 CreateUserViewController
并显示它。
用户与 CreateUserViewController
交互以设置新用户对象的属性 - 姓名、等级、发型等。然后他触摸“完成”按钮。您的 CreateUserViewController
创建新的用户对象并将其放入数据库中。然后它需要关闭自己,这样 UserListViewController
的用户对象列表将再次出现。
但是您希望 User 列表包含新创建的 User 对象,并且您希望滚动列表以便新 User 出现在屏幕上。因此,您需要一种方法让您的 CreateUserViewController
将新创建的 User 对象告知 UserListViewController
。这是代表进来的地方。
你这样定义一个协议(protocol):
@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
中,您采用并实现协议(protocol):
@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
时,您将新 Controller 的委托(delegate)设置为 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];
}
关于objective-c - 如何从另一个 View Controller 呈现一个 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9058733/