我有一个应用程序,我有一个很长的例程来绘制pdf文档。我需要从许多视图控制器访问它,但我不知道如何。当代码被复制到每个VC的.m文件中时,我知道这是荒谬的。其中一个问题是每个VC都有大量需要发送到MakePdf例程的变量,并且在VC之间发送数据似乎有问题(或者至少这是我开始理解的)。
任何指针?
这就是我想要的:
答案 0 :(得分:3)
您应该使用单例方法(例如" + sharedObject")和所有代码创建一个类。 然后使用以下代码访问它:
[[MyClass sharedObject] mySharedMethodForPdf];
http://www.johnwordsworth.com/2010/04/iphone-code-snippet-the-singleton-pattern/
答案 1 :(得分:3)
您可以使所有需要访问此方法(以及任何其他方法)的视图控制器成为实现此功能的类的子类。然后他们都会继承make pdf代码。
答案 2 :(得分:1)
我肯定会创建一个抽象的 UIViewController类,它具有共同的特征,或至少是一个协议,如<PDFMakerDataSource>
。
PDFMaker
单身可能没问题,在PDFMaker上定义 activeViewController
属性。
因此,当VC出现时,我会设置该属性,然后您可以在PDFMaker上调用make,它将使用当前绑定的VC作为数据源。
无论如何,为什么单身人士? 为什么不创建PDFMaker对象?您可以使用每个VC创建它,因此每个VC都应该有一个实例。
类似的东西:
@interface PDFMaker : NSObject
+(id)pdfMakerWithDataSource:(id<PDFMakerDataSource>) dataSource;
-(void)makePDFwithCompletion:(void(^)(id PDF)) completionBlock;
@end
和数据源一样,如:
@protocol PDFMakerDataSource <NSObject>
@optional
-(NSString*)fileName;
-(UIImage*)coverImage;
-(NSString*)whateverData;
@end
所以现在世界上每个VC都可以 PDFMaker恭维,如:
@interface SomeViewController : UIViewController <PDFMakerDataSource>
@property (nonatomic, strong) PDFMaker *pdfMaker;
@end
@implementation SomeViewController
-(void)viewDidLoad
{
[super viewDidLoad];
self.pdfMake = [PDFMaker pdfMakerWithDataSource:self];
}
// PDFMaker data source implementation (bind to UI for example)
-(NSString*)fileName
{ return self.fileNameTextField.text; }
-(NSString*)coverImage
{ return self.coverImageView.image; }
...
// Make That PDF
-(IBAction)makePDF
{
[self.pdfMaker makePDFwithCompletion:^(id PDF)
{ NSLog(@"Shiny PDF just made: %@", PDF); }
}
@end