无法传递 UIVewController 的实例 - iOS
Cannot pass instance of UIVewController - iOS
我有一个带有我制作的方法的应用程序,我的想法是这个方法将打开我想要的任何视图控制器。我做到了,所以我必须有很多相同代码的副本。但是,它不起作用,Xcode 不断出现错误:
Invalid operands to binary expression (UIViewController ) and 'unsigned long()(const char*)')
这是我的方法:
-(void)open_view_controller:(UIViewController *)controller_name :(NSString *)view_name {
controller_name *screen = [[controller_name alloc] initWithNibName:view_name bundle:nil];
screen.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:screen animated:YES completion:nil];
}
我只是想避免这样做:
CallCreator *screen = [[CallCreator alloc] initWithNibName:@"CallCreator" bundle:nil];
screen.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:screen animated:YES completion:nil];
我该如何解决这个错误?我不明白哪里出了问题,我传递的是正确的类型 - UIViewController
.
丹,谢谢你的时间。
这样,您在 nib 文件中的 Viewcontroller 名称和 view_name 参数字符串必须相同。
+ (void)open_view_controller:(UIViewController *)controller_name :(NSString *)view_name {
Class class = NSClassFromString(view_name);
controller_name = [[class alloc] initWithNibName:view_name bundle:nil];
controller_name.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:controller_name animated:YES completion:nil];
}
第二种方式,
+ (void)open_view_controller:(Class)controller_name :(NSString *)view_name {
UIViewController *controller = [[controller_name alloc] initWithNibName:view_name bundle:nil];
controller.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:controller animated:YES completion:nil];
}
您不能简单地使用特定类型的变量来实例化该类型的另一个对象。 alloc
是 Class
上的 class 方法。您可以使用 NSClassFromString
基于字符串值获取 Class
对象,然后使用它来实例化您的对象
我想你想这样做 -
-(void)open_view_controller:(NSString *)controller_name :(NSString *)view_name {
UIViewController *screen = [[NSClassFromString(controller_name) alloc] initWithNibName:view_name bundle:nil];
screen.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:screen animated:YES completion:nil];
}
要使用它,你可以说
[someObject open_view_controller:@"CallCreator" :@"CallCreator"]
我建议您更改方法签名以符合 Objective C 约定 -
-(void) openViewControllerWithClassName:(NSString *)className nibName:(NSString *)nibName
您应该使用 Class
而不是 UIViewController *
- (void)presentViewControllerOfClass:(Class)controllerClass viewName:(NSString *)viewName;
{
UIViewController *screen = [[controllerClass alloc] initWithNibName:viewName bundle:nil];
screen.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:screen animated:YES completion:nil];
}
可以像
一样使用
[self presentViewControllerOfClass:MyViewController.class viewName:@"MyViewController"];
在您提到的代码中,controller_name 应该是 UIViewController 类型的对象。您不能再次实例化一个对象。
更清楚地说,当你写:
-(void)open_view_controller:(UIViewController *)controller_name :(NSString *)view_name
此处,(UIViewController *)controller_name
表示您正在传递 class 类型 UIViewController 的对象 controller_name。
你应该在这里做的是,为视图控制器的 class 名称传递一个 NSString,然后尝试使用这样的东西实例化:
-(void)openViewController:(NSString *)controllerName viewName:(NSString *)viewName {
id obj = [[NSClassFromString(controllerName) alloc] init];
//rest of the code
}
我有一个带有我制作的方法的应用程序,我的想法是这个方法将打开我想要的任何视图控制器。我做到了,所以我必须有很多相同代码的副本。但是,它不起作用,Xcode 不断出现错误:
Invalid operands to binary expression (UIViewController ) and 'unsigned long()(const char*)')
这是我的方法:
-(void)open_view_controller:(UIViewController *)controller_name :(NSString *)view_name {
controller_name *screen = [[controller_name alloc] initWithNibName:view_name bundle:nil];
screen.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:screen animated:YES completion:nil];
}
我只是想避免这样做:
CallCreator *screen = [[CallCreator alloc] initWithNibName:@"CallCreator" bundle:nil];
screen.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:screen animated:YES completion:nil];
我该如何解决这个错误?我不明白哪里出了问题,我传递的是正确的类型 - UIViewController
.
丹,谢谢你的时间。
这样,您在 nib 文件中的 Viewcontroller 名称和 view_name 参数字符串必须相同。
+ (void)open_view_controller:(UIViewController *)controller_name :(NSString *)view_name {
Class class = NSClassFromString(view_name);
controller_name = [[class alloc] initWithNibName:view_name bundle:nil];
controller_name.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:controller_name animated:YES completion:nil];
}
第二种方式,
+ (void)open_view_controller:(Class)controller_name :(NSString *)view_name {
UIViewController *controller = [[controller_name alloc] initWithNibName:view_name bundle:nil];
controller.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:controller animated:YES completion:nil];
}
您不能简单地使用特定类型的变量来实例化该类型的另一个对象。 alloc
是 Class
上的 class 方法。您可以使用 NSClassFromString
基于字符串值获取 Class
对象,然后使用它来实例化您的对象
我想你想这样做 -
-(void)open_view_controller:(NSString *)controller_name :(NSString *)view_name {
UIViewController *screen = [[NSClassFromString(controller_name) alloc] initWithNibName:view_name bundle:nil];
screen.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:screen animated:YES completion:nil];
}
要使用它,你可以说
[someObject open_view_controller:@"CallCreator" :@"CallCreator"]
我建议您更改方法签名以符合 Objective C 约定 -
-(void) openViewControllerWithClassName:(NSString *)className nibName:(NSString *)nibName
您应该使用 Class
而不是 UIViewController *
- (void)presentViewControllerOfClass:(Class)controllerClass viewName:(NSString *)viewName;
{
UIViewController *screen = [[controllerClass alloc] initWithNibName:viewName bundle:nil];
screen.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:screen animated:YES completion:nil];
}
可以像
一样使用[self presentViewControllerOfClass:MyViewController.class viewName:@"MyViewController"];
在您提到的代码中,controller_name 应该是 UIViewController 类型的对象。您不能再次实例化一个对象。
更清楚地说,当你写:
-(void)open_view_controller:(UIViewController *)controller_name :(NSString *)view_name
此处,(UIViewController *)controller_name
表示您正在传递 class 类型 UIViewController 的对象 controller_name。
你应该在这里做的是,为视图控制器的 class 名称传递一个 NSString,然后尝试使用这样的东西实例化:
-(void)openViewController:(NSString *)controllerName viewName:(NSString *)viewName {
id obj = [[NSClassFromString(controllerName) alloc] init];
//rest of the code
}