我将一个工作的viewcontroller类从另一个项目复制到一个新项目中。我无法在新项目中加载视图。在旧项目中,我使用了presentModalViewController。在新的我无法使用presentModalViewController或presentViewController
加载视图我正在尝试从主视图控制器加载当前视图。
这是我的主视图控制器界面的样子......
// ViewController.h
#import <UIKit/UIKit.h>
#import "RequestDialogViewController.h"
@interface ViewController : UIViewController <RequestDialogViewControllerDelegate> {
}
- (void)requestDialogViewDidDismiss:(RequestDialogViewController *)controller withResponse:(NSString*)response;
我正在使用这样的presentModalViewController ......
RequestDialogViewController *requestIPViewController = [[RequestDialogViewController alloc] initWithNibName:@"RequestDialogViewController" bundle:nil];
navigationController = [[UINavigationController alloc] initWithRootViewController:requestIPViewController];
[self presentModalViewController:navigationController animated:YES];
像这样的和presentViewController ...
RequestDialogViewController *requestIPViewController = [[RequestDialogViewController alloc] initWithNibName:@"RequestDialogViewController" bundle:nil];
[self presentViewController:requestIPViewController animated:YES completion:nil];
我在新项目中缺少什么?触发init方法,但viewDidLoad不会触发,也不会显示任何内容。
由于
答案 0 :(得分:84)
如果ViewController
是根视图控制器,则它无法在其自己的viewDidLoad
内呈现模态视图控制器,因为此时它没有屏幕大小等信息。 / p>
如果已经显示其他视图控制器,则可以使用。如果根视图控制器是UINavigationController
,当模态视图从底部向上滑动时,您将看到从右侧滑入的视图。
无论如何,对于你的ViewController
,你最快可以呈现它是在它变得可见之后。使用计时器是不可靠的;较旧和较慢的设备具有显着更长的加载时间。
为了获得更高的可靠性,请为viewDidAppear:
实施ViewController
。仍然使用您的计时器系统添加额外的延迟;几分之一秒就足够了。虽然在iOS 5.1模拟器中为我提供模态视图控制器viewDidAppear
,Presenting a modal view controller when loading another ViewController说它有时不会发生。
答案 1 :(得分:4)
我已经解决了。我试图从视图中显示主视图控制器的负载。不知道为什么它在那里不起作用,而是我现在设置一个定时器,它调用一个方法在主视图加载后呈现视图控制器,现在它正常工作...
[self presentViewController:requestIPViewController animated:YES completion:nil];
感谢那些回复的人。
答案 2 :(得分:3)
正如@Dondragmer所说,如果你想在root视图的viewDidLoad中展示你的viewController,它将会失败。一旦你的viewController准备就绪,你就可以展示你的新viewController。 所以,你可以在
中做到这一点- (void)viewDidLayoutSubviews {
//present here
}
答案 3 :(得分:0)
我遇到了同样的问题。但我的情况是presentViewController
在另一个ViewController的dismissViewControllerAnimated
之后调用。我的解决方案是将presentViewController
移至dismissViewControllerAnimated
的完成块。
答案 4 :(得分:-1)
提出modalViewController:
为了所有初学程序员的利益,请键入它而不是复制粘贴。
myVC *viewController = [[myVC alloc]initWithNibName:@"myVC" bundle:nil];
viewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:viewController animated:YES];
[viewController release];
看起来你试图在第一个样本中将导航控制器作为视图控制器呈现,然后你在第二个中使用了错误的方法。