无法传递 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];
}

您不能简单地使用特定类型的变量来实例化该类型的另一个对象。 allocClass 上的 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
}