我是iPhone开发的新手,我真的把它带给了我。我喜欢它,但有一件事让我感到困惑。如何保持切换视图?我知道如何从我创建新项目时给出的第一个视图,到我制作的视图,但是如何通过这两个窗口?如何从我创建的视图中获取?
我有这个应用程序,它有一个带有NavigationController的主窗口,它带有一个UITableViewController。这是我的主菜单。我右上角有一个“+” - 按钮,它给了我一个新视图,但我如何从这里获得一个新视图?当用户选择要添加的内容时,如何推送新视图?
希望有人理解我的问题。一些文档的链接没问题。我到处寻找。
答案 0 :(得分:3)
你可以做很多不同的方式,你可以做塞巴斯蒂安所说的,你也可以有一个共同的RootViewController来管理你的其他视图控制器视图。这就是我喜欢做的事情,我实际上在RootViewController上定义了一个类似于ToggleView的协议:UIViewController newController UIViewController:oldController。我做任何UIViewController,我希望能够从该视图切换到另一个实现此协议。这样做是因为通常当您单击按钮时,您知道下一个要查看的视图。因此,当用户单击按钮时,在拥有该按钮的UIViewController中,我创建了我想要将其视图推入屏幕的新ViewController,这很好,因为它还允许我在视图控制器中设置数据而不必委托它到其他一些对象或使用单例来获取新视图中的数据,然后我调用我的toggleView方法,根视图控制器进行切换。我觉得这很有效,而且还有任何涉及的代码。我不总是这样,如果我知道一个新的视图将总是来自另一个特定的视图,(例如一个人查看事件和创建这些事件的主页),在这种情况下,我将松散地耦合视图控制器通过使用协议。
答案 1 :(得分:1)
对于这种特殊情况,人们通常使用UIViewController
的{{3}}方法。 UINavigationController
是UIViewController
的子类,因此您的代码看起来像这样:
UIViewController *addingViewController = [[UIViewController alloc] initWithNibName:@"AddingView" bundle:nil];
[[self navigationController] presentModalViewController:addingViewController animated:YES];
[addingViewController release];
答案 2 :(得分:1)
这是rootviewcontrollerdelegate定义
@protocol RootViewControllerViewDelegate
- (void)toggleView:(UIViewController )newController viewController:(UIViewController )oldController;
@end
toggleView的可能实现
-(void)toggleView:(UIViewController *)newController viewController:(UIViewController*)oldController {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1];
[UIView setAnimationTransition:([oldController.view superview] ? UIViewAnimationTransitionFlipFromLeft : UIViewAnimationTransitionFlipFromLeft) forView:self.view cache:YES];
[newController viewWillAppear:YES];
[oldController viewWillDisappear:YES];
[oldController.view removeFromSuperview];
[self.view addSubview:newController.view];
[oldController viewDidDisappear:YES];
[newController viewDidAppear:YES];
[UIView commitAnimations];
[oldController release];
}
这将通过翻转视图来滑动视图控制器
显然你必须在某处创建一个新的RootViewController并从那里开始查看(可能是app delegate)
现在,如果你想让ViewController能够使用RootViewController,它必须符合协议,你可以在类接口中声明它,如此
@interface MyViewController : UIViewController <RootViewControllerDelegate> {
id delegate;
}@property(assign) id <RootViewControllerViewDelegate> delegate;
现在,您可以使用delegates方法将视图交换为另一个视图,因为所有内容都已正确初始化。交换两个控制器视图的代码可能看起来像这样
NewViewController *viewController=...
//you can set up your viewControllers data here if you need to
//Since its probable that this view has that data it can just set it instead of
//delegating
viewController.delegate=delegate; //setting up the RootViewController reference
[delegate toggleView:viewController viewController:self];
记得在toggleView上回调以释放旧的ViewController,如果你因为丢失了对该控制器的所有引用而没有泄漏。