我正在为第三方开发人员构建一个框架。我构建的方式是我创建了一个静态 iOS 项目,并按照列出的步骤 here 进行操作。 .现在我将以下内容添加到该框架示例中:
向框架项目添加了 ViewController
该项目的主要公共(public)类有一个第三方开发人员将实现的委托(delegate)
现在我需要实现的是,例如,第三方开发人员使用我的框架并将委托(delegate)设置为他们的应用程序的类。我希望我的框架做的是在他们的 View 顶部呈现一个 View Controller ,显示所需的内容内容。
原来框架项目中的主类是一个NSObject类,不支持presentModalViewController
等方法
那么您能否建议一种实现上述目的的方法,即我的框架应该在委托(delegate) View 之上呈现一个 View Controller 。另外,我正在框架项目中使用界面生成器创建 View Controller 。请建议这是否是正确的方法。如果没有,您认为我如何设计在调用 View 之上所需的 View 布局 - 纯粹通过代码?
最佳答案
我认为你应该遵循 MFMailComposeViewController 的模式以及标准 SDK 中的其他几个。这意味着您的框架将提供公共(public)类,它是 UIViewController 的子类。
#import <MyFramework/MyFrameworkViewController.h>
@interface CustomerViewController : UIViewController <MyFrameworkViewControllerDelegate>
@end
- (IBAction)pressedShowFrameworkVC:(id)sender {
MyFrameworkViewController *frameworkVC = [[MyFrameworkViewController alloc] init];
// your framework init can init from your bundle's nib
frameworkVC.delegate = self;
[self presentViewController:frameworkVC animated:YES completion:^{}];
}
当用户完成它时,你的框架 vc 会自行解散。
// MyFrameworkViewController.m
[self dismissViewControllerAnimated:YES completion^{
[self.delegate frameworkVC:self didFinishWithStuff:@"Done"];
}];
您的客户实现此...
- (void)frameworkVC:(MyFrameworkViewController *)frameworkVC didFinishWithStuff:(NSString *)objectDescribingCompletionState {
}
编辑 - 假设您的框架还需要为客户应用程序执行一些与 View Controller 无关的工作。它仍然可以提供 NSObject(或 NSURLConnection 或其他)的子类作为另一个公共(public)类。
// CustomerViewController.m
#import <MyFramework/MyFrameworkWorkerBee.h>
- (IBAction)pressedMakeMyFrameworkDoSomethingUseful:(id)sender {
MyFrameworkWorkerBee *workerBee = [[MyFrameworkWorkerBee alloc] init];
[workerBee fetchStuffFromTheWebWithCompletion:^(id result) {
// now present results
MyFrameworkViewController *frameworkVC = [[MyFrameworkViewController alloc] init];
frameworkVC.delegate = self;
frameworkVC.resultsToPresent = results;
[self presentViewController:frameworkVC animated:YES completion:^{}];
}];
}
关于ios - 框架、委托(delegate)和 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15686487/