如何制作一个程序并在所有视图控制器中使用它?

时间:2013-12-21 14:12:29

标签: ios uiapplicationdelegate

我有一个程序,我需要很多(如果不是全部)我的视图控制器。我想知道如何将它放在一个地方(代码清洁和维护)并在其他地方使用它。

4 个答案:

答案 0 :(得分:2)

有多种方法可以解决这个问题 - 具体取决于您希望实现的目标。

如果此方法与U IViewController的生命和数据相关联,您可能希望将UIViewController作为子类或制作UIViewController类别。

答:子类化(您想要添加一些自定义属性,变量,方法或者您想要覆盖方法):

<强> MySubclassedViewController.h

#import <UIKit/UIKit.h>

@interface MySubclassedViewController : UIViewController

@property (copy) NSString *myVerySpecialString;

-(void) myVerySpecialMethod;

@end

<强> MySubclassedViewController.m

#import "MySubclassedViewController.h"

@implementation MySubclassedViewController

-(void) initialization
{
    self.myVerySpecialString = @"initialized";

}

- (id)initWithCoder:(NSCoder*)aDecoder
{
    self = [super initWithCoder:aDecoder];

    if (self)
    {
        [self initialization];
    }

    return self;
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];

    if (self)
    {
        [self initialization];
    }
    return self;
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if (self)
    {
        [self initialization];
    }
    return self;
}

-(void) viewDidLoad
{
    [super viewDidLoad];

    [self myVerySpecialMethod];
}

-(void) myVerySpecialMethod
{
    if ([self.myVerySpecialString isEqualToString: @"initialized"])
    {
        self.backgroundColor = [UIColor yellowColor];
    }
}

@end

B:类别(您只想在课程中添加一些额外的方法):

<强>的UIViewController + SpecialCatrgory.h

#import <UIKit/UIKit.h>

@interface UIViewController (SpecialCategory)

-(void) myVerySpecialMethod;

@end

<强>的UIViewController + SpecialCatrgory.m

#import "UIViewController+SpecialCatrgory.h"

@implementation UIViewController (SpecialCategory)

-(void) myVerySpecialMethod
{
    self.backgroundColor = [UIColor yellowColor];   
}

@end

C:专用助手类

另一方面,如果您发现自己可能在多个地方使用某种独立方法 想要考虑编写一个辅助类并将其用作单例。

<强> MyHelperClass.h

@interface MyHelperClass : NSObject

+ (instancetype)sharedHelper;

-(NSString *) myVerySpecialMethod;

@end

<强> MyHelperClass.m

#import "MyHelperClass.h"

@implementation MyHelperClass

+ (instancetype)sharedHelper
{
    static MyHelperClass *_sharedHelper = nil;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        _sharedHelper = [[MAConnectionClient alloc] init];
    });

    return _sharedHelper;
}

-(NSString *) myVerySpecialMethod
{
    return @"a result from your very special method";
}

@end

您只需导入MyHelperClass.h(或将其放入-Prefix.pch)即可使用它,而无需显式创建实例。例如:

NSString *someString = [[MyHelperClass sharedHelper] myVerySpecialMethod];

答案 1 :(得分:1)

有很多方法可以实现这一目标。

  1. 创建基本视图控制器并添加您的过程。在所有视图控制器中对其进行子类化。

  2. 创建一个公共实用程序类并添加您的过程并将其作为类方法。

  3. 在.pch文件中添加您的程序。

答案 2 :(得分:1)

我们有很多方法可以做到,但通常创建一个全局类,将其导入YourProjectName-Prefix.pch文件。


我们也可以采用另一种方式,即创建任何类方法,你可以通过它的类名调用它。

一个例子,您可能已经在代码中多次看到 - :

appDelegate.h文件中,如果我们制作此方法并在appDelegate.m文件中实现,那么

+ (NSString *)applicationDocumentDir
{
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}

然后我们可以从代码中的任何地方访问它,如:

NSString *strTemp = [AppDelegate applicationDocumentDir];

要了解更多更好的方法,请点击此处。

Use of a singleton for creating a basic style helper class

答案 3 :(得分:1)

如果您不确定该方法是否会在所有控制器中使用,我建议您为要添加的功能创建一个类别。您可以找到类别here的良好介绍。

如果您确定在所有UIViewController中都需要它,那么创建基本控制器和子类应该是更好的方法。

所有其他实现方法(在实用程序中放置类方法/添加到* -Prefix.pch)都可以,但可能是理想的解决方案(假设您添加的功能是仅适用于UIViewController)。