objective-c - 如何从另一个 View Controller 呈现一个 View Controller

标签 objective-c ios cocoa-touch

如果满足特定条件,我将尝试从另一个 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 节):

View Controller Programming

有人可以给我提示吗?谢谢..

编辑 添加自定义构造函数

    -(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/

相关文章:

ios - 将KVO添加到核心数据的类别属性

ios - UIColor 扩展便利初始化不起作用

ios - 返回(聚焦)Adobe AIR 应用程序时停止背景音乐 (iOS)

iphone - UINavigationController 栈

c++ - cpp 文件 #include 导致错误,@class 不

ios - NSOperation 阻止 UI 绘制?

iphone - Reminders.app 双向同步逻辑

objective-c - iPhone:以编程方式将选项卡栏 Controller 添加到导航 Controller

ios - 这些 NSArray 初始化方法有何不同?

iphone - 线程中的 CADisplayLink