ios - 重构ViewController(重复逻辑)

标签 ios objective-c uiviewcontroller mfmessagecomposeviewcontroller

在我的应用中,每个 ViewController 都有相同的逻辑。 我想将它提取到一个类中。

这是我的案例。

每个 ViewController 都有各种发送 iMessage 的逻辑。 View Controller 的总数约为 50。

这是第一个 VC。

@interface FirstViewController : UIViewController <MFMessageComposeViewControllerDelegate>
....
- (void)sendMessage {
    MFMessageComposeViewController *mfvc = [[MFMessageComposeViewController alloc] init];
    .....
    [self presentViewController:mfvc animated:YES completion:^{}];
}

// Delegate
- (void)messageComposeViewController:(MFMessageComposeViewController *)controller 
             didFinishWithResult:(MessageComposeResult)result {
    [self dismissViewControllerAnimated:YES completion:^{}];
}

这是第二个 VC。

@interface SecondViewController : UIViewController <MFMessageComposeViewControllerDelegate>
....
- (void)sendMessage {
    MFMessageComposeViewController *mfvc = [[MFMessageComposeViewController alloc] init];
    .....
    [self presentViewController:mfvc animated:YES completion:^{}];
}

// Delegate
- (void)messageComposeViewController:(MFMessageComposeViewController *)controller 
             didFinishWithResult:(MessageComposeResult)result {
    [self dismissViewControllerAnimated:YES completion:^{}];
}

大约有 50 个这样的 View Controller 。

所以,我想按如下方式更改它。

@interface SendMessageHelper : XXX <MFMessageComposeViewControllerDelegate>
....
- (void)sendMessage:(NSString *messageBody) {
    // All the code that sends the iMessage include "presentViewController"
}

// Delegate
- (void)messageComposeViewController:(MFMessageComposeViewController *)controller 
                 didFinishWithResult:(MessageComposeResult)result {
    // Dismiss iMessage ViewController
}

///////////////////////////////////////////////////////////////////

@interface FirstViewController : UIViewController 
....
- (void)sendMessage {
    // Just call SendMessageHelper's sendMessage:
}

@interface SecondViewController : UIViewController 
....
- (void)sendMessage {
    // Just call SendMessageHelper's sendMessage:
}

....

@interface FiftiethViewController : UIViewController 
....
- (void)sendMessage {
    // Just call SendMessageHelper's sendMessage:
}

是否可以在单独的类中处理所有与 MFMessageComposeViewController 相关的逻辑和委托(delegate)? 我该如何实现?

如果不行,请指教更好的方法。

最佳答案

您有多种选择。您可以创建一个 UIViewController 的子类来实现您的方法,并使所有 50 个 View Controller 成为该自定义子类的子类。

在这种情况下,在添加了这些方法的 UIViewController 上创建一个类别可能会更好:

标题:

@interface UIViewController (Messages);
  // Delegate
  - (void)messageComposeViewController:(MFMessageComposeViewController *) controller 
    didFinishWithResult:(MessageComposeResult)result;
@end

.m 文件:

@implementation UIViewController (Messages) {
  - (void)sendMessage {
      MFMessageComposeViewController *mfvc =[[MFMessageComposeViewController alloc] init];
      .....
      [self presentViewController:mfvc animated:YES completion:^{}];
  }

  // Delegate
  - (void)messageComposeViewController:(MFMessageComposeViewController *)controller 
    didFinishWithResult:(MessageComposeResult)result {
      [self dismissViewControllerAnimated:YES completion:^{}];
  }
@end

然后,如果您#import 头文件,那么这些方法将可用。

关于ios - 重构ViewController(重复逻辑),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42138501/

相关文章:

ios - AVAssetExportSession 导出AsynchronouslyWithCompletionHandle : export audio error

ios - 覆盖扩展方法的替代方法

swift - 如何在另一个 View Controller 中使用主视图 Controller 的函数中定义的变量?

iphone - 问题 pushViewController 从 Landscape 到 Portrait

ios - 如何可靠地检测 uiview 框架相对于屏幕的原点 Y?

ios - 语音识别在 iOS 上出现错误

ios - 当 UITableView 中滚动不够快时,UITextField 放弃第一响应者

iphone - 动态 UIScrollView 中的动态 UITextView - iOS

ios - UITableViewCell 在出队时重绘

ios - View Controller 在 iOS 7 中不旋转