在视图控制器之间共享例程

时间:2014-01-23 10:29:59

标签: ios

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

任何指针?

这就是我想要的:

enter image description here

3 个答案:

答案 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