2014-01-23 120 views
1

我有一个应用程序,我有一个很长的例程来绘制一个PDF文档。我需要从许多视图控制器访问这个,但我不知道如何。就在代码被复制到每个VC的.m文件的时候,我知道这是荒谬的。其中一个问题是每个VC都有大量需要发送到MakePdf例程的变量,并且在VC之间发送数据似乎存在问题(或者至少这是我开始理解的)。在视图控制器之间共享一个例程

任何指针?

这是我想什么:

enter image description here

+0

您是否需要创建PDF时来自每个VC的每个数据?或者每个VC创建一个PDF? – Geri

回答

3

你应该做一个一流的,具有特殊方法(如“+共享对象”)的所有代码。 然后你使用此代码访问它:

[[MyClass sharedObject] mySharedMethodForPdf]; 

http://www.johnwordsworth.com/2010/04/iphone-code-snippet-the-singleton-pattern/

+0

谢谢 - 我刚刚开始这样做,但我可以将VC1中的变量名称放在共享类中,以便在从VC1访问它时包含它?或者我需要将变量发送到共享类吗? – RGriffiths

+3

我认为你必须把所有关于pdf的逻辑放在共享对象中,并且通过这个方法给它提供动态数据。 –

3

也许你认为需要访问这个方法(和任何其他人),将实现该功能的类的子类的所有视图控制器。然后他们会继承make pdf代码。

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的compilant,如:

@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 
相关问题