通过引用传递 UIViewController 或在另一个处理程序类中获得自我控制

Posted

技术标签:

【中文标题】通过引用传递 UIViewController 或在另一个处理程序类中获得自我控制【英文标题】:Passing UIViewController by reference or get self control in another handler class 【发布时间】:2014-09-19 14:04:22 【问题描述】:

我创建了一个单独的类 MyUtil 用于处理一些基本操作,如导航左右按钮及其事件。 LeftButton(UIBarButton left) 已处理但 right 显示但未处理。

请建议我换一种方式。

MyUtil.h

    #import <Foundation/Foundation.h>

    @interface 

    @interface MyUtil : NSObject

    @property(strong,nonatomic) UIViewController *uiv;

    -(void)NavAndBackBtn:(UIViewController *)context;// it is running awesome.

    -(void)NavAndForwardBtn:(UIViewController *)context :(NSString *)vc_name;//it displays right button but don't know how to add pushViewController to it in this class. 
//context is self of calling ViewController and vc_name is the name of ViewController which i want to push

    @end

MyUtil.m

#import "MyUtil.h"
#import "ForgotPassViewController.h"

@implementation MyUtil


-(void)pushingView:(UIViewController *)vvc  secondInput:(NSString *)view_name

    Class theClass = NSClassFromString(view_name);

    id myObject = [[theClass alloc] init];

    [vvc.navigationController pushViewController:myObject animated:YES];


-(void)method:(NSArray *)val



-(void)NavAndBackBtn:(UIViewController *)context


    UIButton *button =  [UIButton buttonWithType:UIButtonTypeCustom];

    [button setImage:[UIImage imageNamed:@"icon_back2.png"] forState:UIControlStateNormal];

     [button addTarget:context.navigationController action:@selector(popViewControllerAnimated:)forControlEvents:UIControlEventTouchUpInside];

    [button setFrame:CGRectMake(0, 0, 36, 20)];

    UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithCustomView:button];

    context.navigationItem.leftBarButtonItem =barButton;


-(void)myMethode:(NSArray*)params


    UIViewController *vvc = [params objectAtIndex:0];

    NSString *strArg = [params objectAtIndex:1];

    Class theClass = NSClassFromString(strArg);

    id myObject = [[theClass alloc] init];

    [vvc.navigationController pushViewController:myObject animated:YES];


-(void)NavAndForwardBtn:(UIViewController *)context :(NSString *)vc_name

    UIButton *button =  [UIButton buttonWithType:UIButtonTypeCustom];

    [button setTitle:@"Skip" forState:UIControlStateNormal];

    [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];

    [button setFrame:CGRectMake(0, 0, 36, 20)];

    //[button setImage:[UIImage imageNamed:@"icon_back2.png"] forState:UIControlStateNormal];

   // NSArray *params = [NSArray arrayWithObjects:context,vc_name,nil];

    [button addTarget:self.leftDelegate action:@selector(context)forControlEvents:UIControlEventTouchUpInside];

   // [button addTarget:self action:@selector(myMethode:) forControlEvents:UIControlEventTouchUpInside];

 // [button add]
    //[button performSelector:@selector(myMethode:) withObject:params afterDelay:15.0];


    /// doctory...
//    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:
//                                [context methodSignatureForSelector:@selector(changeImage:)]];
//    
//    [invocation setTarget:context];
//    
//    [invocation setSelector:@selector(changeImage:)];
//    
//    [invocation setArgument:(__bridge void *)(context) atIndex:2];
//   
//    [invocation setArgument:(__bridge void *)(vc_name) atIndex:3];
//    
//    [NSTimer scheduledTimerWithTimeInterval:0.1f invocation:invocation repeats:NO];




    UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithCustomView:button];

    context.navigationItem.rightBarButtonItem =barButton;



-(void) pushNewVC: (UIViewController *) vvc : (NSString *) str


    NSString *strArg = str; //[NSString stringWithFormat:string];

    Class theClass = NSClassFromString(strArg);

    id myObject = [[theClass alloc] init];

    [vvc.navigationController pushViewController:myObject animated:YES];


@结束

我已经尝试了两天,但没有找到通过引用让自己进入另一个班级的方法。有人说不可能通过引用传递,但它可以做任何你想做的事情。我将自己发送到 MyUtil.m 类,它显示左右 UINavigationItem.leftButton 和 RightButton。

MyUtil 中的左按钮

 [leftbutton addTarget:context.navigationController action:@selector(popViewControllerAnimated:)forControlEvents:UIControlEventTouchUpInside]; //it is doing absolutely what i wanted..

现在让右键打开(Push ViewController)我做了

[右键addTarget:context.navigationController action:@selector(pushViewController:animated:)forControlEvents:UIControlEventTouchUpInside];

// 我如何传递一个 UIViewController 来打开。上面的函数如何知道要打开什么

我尝试了多种方法来解决这个问题 第一种在选择器中传递多个参数的方法; myMethode:(NSArray *)params

问题 1

是否可以将 self 作为 &self 发送。并在另一个班级中获得它。我在 MyUtil.h 中尝试过。我也使用**双指针,但它没有通过。

问题 2 在我的情况下是否可以使用多个参数,它们是 UIViewController 和 NSString 或两者都是 UIViewController

问题 3

有没有办法将 UIViewController 发送或附加到给定的语句

问题 4

我创建了一个@property(strong,nonatomic)UIViewController *vc;

当我将 self of calling ViewController 分配给 vc 时。它没有按我的预期工作。有没有办法让另一个 ViewController 的 self 被处理并捕获到该类的属性中。

[button addTarget:context.navigationController action:@selector(pushViewController:animated:) forControlEvents:UIControlEventTouchUpInside];

//我如何告诉这个函数推送哪个 ViewController,因为我有两个 UIViewController 在函数中。

注意 我正在使用另一个名为 MyUtil 的类。主要问题是我无法从 MyUtils 中的函数中调用 [self.navigationController pushViewController:anyVC]

【问题讨论】:

【参考方案1】:

也许我错了,但是你为什么不在 UIViewController 上创建一个 Category 来处理你想做的事情呢?您的 MyUtil 所做的对我来说听起来像是一个类别,在这种情况下,您可以访问自己的 UIViewController。

【讨论】:

以上是关于通过引用传递 UIViewController 或在另一个处理程序类中获得自我控制的主要内容,如果未能解决你的问题,请参考以下文章

通过引用传递或通过复制传递 - Ruby 模块 [重复]

通过值或引用传递容器

通过值或常量引用传递给函数?

通过引用或值传递的数组[重复]

我可以使用传递不同 UIViewController 子类的相同方法吗?

函数/变量范围(通过值或引用传递?)