如何在文件之间重用相同的代码并选择在objective-c中传递参数?

Posted

技术标签:

【中文标题】如何在文件之间重用相同的代码并选择在objective-c中传递参数?【英文标题】:How do I reuse the same code between files with the option to pass in arguments in objective-c? 【发布时间】:2014-05-03 00:56:31 【问题描述】:

我注意到我有一组UIViewController 用于产品过滤系统,它们使用完全相同的代码。这段代码基本上为UIToolBar 创建了按钮,并隐藏了提供它的控制器的UIToolBar。唯一的区别是标题“refine by:.

在每个页面上,我都会在“refine by”之后显示页面类型,例如:在性别过滤页面上,它将显示“Refine by:然后我将附加另一个粗体字符串,显示“Gender " 对于产品类型页面,我将附加一个粗体字符串,上面写着“产品类型”等等。

以下是连接到这些控制器的每个自定义类中重复的代码:

@property (weak, nonatomic) IBOutlet UIToolbar *toolBar;


@end

@implementation VAGRefineProductTypeViewController

    VAGRefineProductTypeViewController *_thisController;


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) 
        // Custom initialization
    
    return self;


- (id)initWithCoder:(NSCoder *)aDecoder

    self = [super initWithCoder:aDecoder];
    if (self) 
        // Custom initialization
        _thisController = self;
    
    return self;



- (void)viewDidLoad


UIToolbar *toolBar = [_thisController toolBar];

[[_thisController navigationItem] setLeftBarButtonItem:nil];
[_thisController setTitle:@"R  E  F  I  N  E     B  Y:"];

// Setup buttons for tool bar
UIButton *clearButton = [[UIButton alloc] initWithFrame:CGRectMake(40, 3, 110, 38)];
UIButton *doneButton = [[UIButton alloc] initWithFrame:CGRectMake(170, 3, 110, 38)];

[clearButton setBackgroundColor:[UIColor darkGrayColor]];
[doneButton setBackgroundColor:[UIColor blackColor]];

[clearButton setTitle:@"Clear" forState:UIControlStateNormal];
[doneButton setTitle:@"Done" forState:UIControlStateNormal];

[clearButton addTarget:_thisController action:@selector(clearButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
[doneButton addTarget:_thisController action:@selector(doneButtonTapped:) forControlEvents:UIControlEventTouchUpInside];

// Add buttons to toolbar
[toolBar addSubview:clearButton];
[toolBar addSubview:doneButton];



- (void)viewWillAppear:(BOOL)animated

    [super viewWillAppear:animated];

    // Hide previous pages tool bar
    [[_thisController navigationController] setToolbarHidden:YES animated:NO];


- (IBAction)clearButtonTapped:(id)sender 
    NSLog(@"CLEAR BUTTON TAPPED");


- (IBAction)doneButtonTapped:(id)sender 
    NSLog(@"DONE BUTTON TAPPED");

这个UIToolBar 被添加到界面生成器中的每个UIViewController。隐藏在 viewWillAppear 中的那个是从UIViewController 以编程方式添加的那个,它呈现了当前的UIViewController

问题:

与其将这段代码复制并粘贴到每个UIViewController 的类文件中,我如何将其放入文件中并在每个UIViewController 中使用该文件?

【问题讨论】:

【参考方案1】:

您有多种选择。可能最简单的方法是定义一个定义共享属性和方法的 UIViewController 基类,然后使所有使用这些属性的视图控制器成为该类的子类。

另一种选择是定义一个定义新方法的 UIViewController 类别。但是,这不允许您向视图控制器添加新的属性或实例变量(至少不会变得棘手。)

【讨论】:

所以我要定义基类。然后将所有这些方法和工具栏属性添加到这个基类。然后只是将每个视图控制器的类更改为基本控制器的子类?如何调用基类的方法? @LondonGuy,这是非常基本的 OOP 内容。您可能想拿起一本关于面向对象编程的书并做一些阅读。否则,您将无谓地挣扎。 我同意。来自 ruby​​ on rails 的这些东西应该会自动浮现在脑海中。不是我不知道该怎么做,而是我似乎忘记了objective-c有能力做这些事情。我往往会错过一些明显的解决方法。我想熟能生巧。自从去年底回来后,我花了一段时间才进入编程的轨道。应用程序越复杂,我需要做的事情就越多,我学到的东西就越多。所以下次我需要重用代码时,我可以采取这条路线或使用类别。我什至发现还有其他方法可以做到这一点,但这是最合适的。

以上是关于如何在文件之间重用相同的代码并选择在objective-c中传递参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何调试,为啥 Spring Boot 集成测试上下文没有在测试之间重用?

使用 glDrawElements (iOS) 重用相同的缓冲区

是否可以在相同的选择中重用聚合函数结果?

如何在不同设备的动画文本之间切换? html/css

如何使用多个选择器重用相同的样式规则

如何在 UIView 和 UIImageView 中重用相同的 IBDesignable 代码