我有一个程序,我需要很多(如果不是全部)我的视图控制器。我想知道如何将它放在一个地方(代码清洁和维护)并在其他地方使用它。
答案 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)
有很多方法可以实现这一目标。
创建基本视图控制器并添加您的过程。在所有视图控制器中对其进行子类化。
创建一个公共实用程序类并添加您的过程并将其作为类方法。
在.pch文件中添加您的程序。
答案 2 :(得分:1)
我们有很多方法可以做到,但通常创建一个全局类,将其导入YourProjectName-Prefix.pch
文件。
我们也可以采用另一种方式,即创建任何类方法,你可以通过它的类名调用它。
一个例子,您可能已经在代码中多次看到 - :
在appDelegate.h
文件中,如果我们制作此方法并在appDelegate.m
文件中实现,那么
+ (NSString *)applicationDocumentDir
{
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}
然后我们可以从代码中的任何地方访问它,如:
NSString *strTemp = [AppDelegate applicationDocumentDir];
要了解更多更好的方法,请点击此处。
答案 3 :(得分:1)
如果您不确定该方法是否会在所有控制器中使用,我建议您为要添加的功能创建一个类别。您可以找到类别here的良好介绍。
如果您确定在所有UIViewController
中都需要它,那么创建基本控制器和子类应该是更好的方法。
所有其他实现方法(在实用程序中放置类方法/添加到* -Prefix.pch)都可以,但不可能是理想的解决方案(假设您添加的功能是仅适用于UIViewController
)。