当我的应用程序启动时,当设置首选项指示用户未接受使用条款时,我正在尝试显示服务条款模式视图。
所以在ApplicationDidFinishLaunchingWithOptions的appDelegate中,我有这段代码:
if (TOSAcceptedPrefValue) { //has not been accepted
// Create the root view controller for the navigation controller
TermsOfServiceController *termsOfServiceController = [[TermsOfServiceController alloc]
initWithNibName:@"TermsOfServiceController" bundle:nil];
// Create the navigation controller and present it modally.
UINavigationController *navigationController = [[UINavigationController alloc]
initWithRootViewController:termsOfServiceController];
termsOfServiceController.delegate = self;
navigationController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentModalViewController:navigationController animated:YES];
[navigationController release];
[TermsOfServiceController release];
NSLog(@"1");
}
但是,Xcode表示termsOfServiceController.delegate = self是“从不兼容的类型'MyAppAppDelegate *'分配给'id'。”
我认为我在AppDelegate标题中完全实现了模态协议:
@protocol TOSModalViewDelegate
- (void)didAcceptTermsOfService:(NSString *)message;
- (void)didRejectTermsOfService:(NSString *)message;
@end
@interface MyAppAppDelegate : NSObject <UIApplicationDelegate, TOSModalViewDelegate> ...
并在modalview标题中:
@protocol ModalViewDelegate ;
@interface TermsOfServiceController : UIViewController {
id<ModalViewDelegate> delegate; ...
...
@property (nonatomic, assign) id<ModalViewDelegate> delegate;
我在modalview实现文件中合成它。
根据这个example,我将AppDelegate.m文件中的代码移动到窗口实例化之后但仍然收到来自Xcode的警告。
警告会导致应用崩溃,并显示以下错误:
2011-09-05 08:34:12.237 MyApp [4416:207] TOSAcceptedPrefValue = 0 2011-09-05 08:34:13.732 MyApp [4416:207] displayWelcomeScreenPrefValue = 0 2011-09-05 08:34:42.889 MyApp [4416:207] - [MyAppAppDelegate presentModalViewController:animated:]:无法识别的选择器发送到实例0x552b430 2011-09-05 08:34:42.892 MyApp [4416:207] ***由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [MyAppAppDelegate presentModalViewController:animated:]:无法识别的选择器发送到实例0x552b430'
所以我的问题是,是否可以从appdelegate显示模态视图,如果是,我应该改变什么来实现它。
感谢您的帮助
答案 0 :(得分:0)
错误是因为MyAppAppDelegate
不是UIViewController
子类,因此无法处理presentModalViewController:animated:
。
所以不,你的app委托不能呈现modalViewController,它必须由真实的视图控制器呈现。这不难做到,只需创建一个在viewDidLoad
中显示您的术语,并在模态控制器退出时做出适当响应,做下一步需要做的事情。