【问题标题】:iOS Can I put all delegate method on another class. Inherit the delegates into a view controlleriOS 我可以将所有委托方法放在另一个类上吗?将委托继承到视图控制器中
【发布时间】:2014-03-03 06:48:28
【问题描述】:

我想要的是将所有委托方法集中到一个类中。我可以使用它的默认值或覆盖委托方法。

例如:

ViewController.m

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>

@end

ViewController.h

#import "ViewController.h"
#import "TableDelegateContainers.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

TableDelegateContainers.h

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return sample.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    return cell;
}

基本上所有 UITableViewDataSource 需要的委托方法都会放到另一个类中。当我将该类导入到 ViewController.h 时,将使用这些方法。如果我愿意,我可以覆盖它们。

这可以通过班级实现吗?还是需要其他实体?

【问题讨论】:

    标签: ios iphone objective-c class delegates


    【解决方案1】:

    我认为他想将委托方法提取到一个单独的类中。所以创建一个自定义类:

    TableViewHelper.h

    @interface TableViewHelper : NSObject<UITableViewDataSource,UITableViewDelegate>
    - (id) initWithTableView: (UITableView *) tableView;
    @end
    

    TableViewHelper.m

    @implementation TableViewHelper
    
    - (id) initWithTableView: (UITableView *) tableView {
        self = [super init];
        if (self) {
            tableView.datasource = self;
            tableView.delegate = self;
        }
        return self;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
        return sample.count;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
        return cell;
    }
    @end
    

    ViewController.m

    @interface ViewController ()
    @property (nonatomic, strong) TableViewHelper *tvHelper;
    @end
    
    @implementation ViewController
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        self.tvHelper = [[TableViewHelper alloc] initWithTableView: self.tableView];
        // Do any additional setup after loading the view, typically from a nib.
    }
    @end
    

    因此您的 ViewController 不再需要实现这两种协议。

    【讨论】:

      【解决方案2】:

      对于documentation

      当一个类采用协议时,它必须实现所需的方法 协议声明,如前所述。此外,它必须 符合所采用的协议所包含的任何协议。如果 并入协议还包含其他协议,类 也必须符合它们。一个类可以符合一个合并的 使用以下任一技术的协议:
      - 实现协议声明的方法
      - 继承自采用协议并实现方法的类

      所以基本上你可以创建一个符合协议的类(例如 ViewController 类),并且你可以让特定的 InheritedViewController 从实现协议的其他类继承

      【讨论】:

        【解决方案3】:

        创建一个 CustomViewController(一个 UIViewController 子类)。您的自定义视图控制器应确认所有协议,提供数据源并处理委托。之后,当您创建任何 UIViewController 类时,只需从您自己的 CustomViewController 继承,并覆盖您需要的所有方法。

        您也可以保留一个 UITableView 的 IBOutlet,并在需要的地方连接您的子控制器。这样您将获得许多其他好处,例如您可以将活动指示器方法保持在通用位置,并处理其他常用的本地通知。

        【讨论】:

          【解决方案4】:

          为此使用协议

          在这里我添加了一个用户友好的link希望你得到一些与你相关的东西

          【讨论】:

            【解决方案5】:

            是的,你可以这样拥有它。

            @implementation SecondViewController
            
            - (void)viewDidLoad
            {
                [super viewDidLoad];
                ViewController *vc = [[ViewController alloc] init];
                myTableView.delegate = vc; //Initialized Controller
                myTableView.dataSource = vc;
                // Do any additional setup after loading the view, typically from a nib.
            }
            
            @end
            

            你也可以在 Xib 中做同样的事情。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-05-25
              • 2011-06-26
              相关资源
              最近更新 更多