2012-01-30 157 views
3

如果满足某些条件,我想从另一个ViewController中打开一个ViewController。代码似乎运行没有错误,但视图从不显示。我是xcode 4/ios 5的新手,所以我必须缺少一些东西。如何从另一个视图控制器呈现视图控制器

这里是负责打开第二视图 - 控制代码:

CreateUserViewController *createUserController = [[CreateUserViewController alloc] initWithNibName:@"CreateUserView" bundle:[NSBundle mainBundle] keyWrapper:keyChainWrapper]; 

    [self presentViewController:createUserController animated:YES completion:nil]; 

在我的项目我有一个名为“CreateUserView”厦门国际银行。我已经为这个xib添加了一个视图控制器,并将其分配给“CreateUserViewController”。

另外我注意到在苹果的文档是显示设置视图控制器的代表被呈现。但似乎没有任何属性称为“委托”在viewcontroller对象上。这个文档是旧的吗?这是我想使用文档(第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; 
} 
+0

你能后的代码在'CreateUserView'上自定义'-initWithNibName:bundle:keyWrapper:'方法? – 2012-01-30 02:46:00

+0

我添加它来发布。谢谢 – Nick 2012-01-30 02:54:07

回答

1

在iOS5的推新视图控制器的方法,真正从iOS4的和Xcode的3综上所述变卦了不少,故事板现在用于创建你的应用视图控制器流程。即使您可能使用独立的.xib文件来构建应用程序,它在iOS5中也不太常见。

无论如何,推动新视图控制器到屏幕上的主要方法是使用segues完成的。看看这个教程的介绍:http://www.raywenderlich.com/5138/beginning-storyboards-in-ios-5-part-1

它很好的解释如何创建一个故事板和使用segues。您仍然可以使用“旧方式”代码呈现视图控制器,但现在引入这些新技术的情况要少得多。 iTunes U上还有一些非常棒的教程 - 搜索CS193P。这是Objective-C的Stanford Introductory类和iOS编程。这应该让你开始,也许可以帮助你想出一种方式来推动你的createUserController以更快的速度与iOS5。

UPDATE

我只是想补充。如果您将程序配置为使用故事板和插槽,则可以使用方法performSegueWithIdentifier:sender:在符合适当条件的情况下执行到createUserController的视图。有关如何使用此方法的信息,请参阅Apple API for UIViewController。

+0

感谢您的信息。我和故事板和Seques做了一些工作。我试图解决的问题是动态显示视图的时候。含义。我只显示此对话框如果用户当前没有登录in.It没有看这是一个用例塞格斯(但是我很新,他们)。我看看performSegueWithIdentifier:发件人:谢谢! – Nick 2012-01-31 03:40:01

+0

尼克 - 为了显示VC动态,您可以定义在故事板SEGUE,然后在你的代码中适当的地方做你检查,看看是否需要显示VC与否。如果你只是使用performSegueWithIdentifier:sender:方法。祝你好运! – 2012-01-31 03:55:05

+0

@JakeV如果我们不在iOS5中使用storyboard,我们需要以编程方式呈现?是[self presentModalViewController:x animated:YES];贬值? – 2013-01-02 06:34:10

4

关于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]; 
} 
+0

我会尽快给这个尝试。感谢你! – Nick 2012-01-30 22:06:36

+0

这是一个非常好的答案。我很感谢代表的例子。但是..我仍然无法从其他视图控制器打开我的视图。我按照你的建议从xib中移除了viewcontroller。我将CreateUserViewController分配给File Owener占位符。然后,我将视图控制器上的视图分配给xib上的视图。 – Nick 2012-01-31 03:49:56

相关问题