Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何创建和创建自己处理协议的UITableViewController子类_Ios_Objective C_Uitableview_Delegates_Protocols - Fatal编程技术网

Ios 如何创建和创建自己处理协议的UITableViewController子类

Ios 如何创建和创建自己处理协议的UITableViewController子类,ios,objective-c,uitableview,delegates,protocols,Ios,Objective C,Uitableview,Delegates,Protocols,好的,我正在构建一个定制的TableViewController。其思想是抽象出创建它所需的大多数方法。 我所做的是: LPTableViewController,它继承自UITableViewController,并符合并实现所有TableViewController方法,因此,如果将其指定为故事板中TableViewController的控制器类,则其工作正常。 但真正的想法是像使用自定义控件一样使用它,因此我将创建一个“MainTableViewController”类,该类将挂接在故事板

好的,我正在构建一个定制的TableViewController。其思想是抽象出创建它所需的大多数方法。 我所做的是: LPTableViewController,它继承自UITableViewController,并符合并实现所有TableViewController方法,因此,如果将其指定为故事板中TableViewController的控制器类,则其工作正常。 但真正的想法是像使用自定义控件一样使用它,因此我将创建一个“MainTableViewController”类,该类将挂接在故事板中,并从LPTableViewController继承

当我需要为我的类创建一个自定义协议时,我的问题就出现了,该协议将向LPTableViewController返回一个包含数据的数组来填充TableView。但是我不知道如何以一种有效的方式实现它。以下是我所拥有的:

LPTreeView.h

@protocol LPTreeViewDelegate <NSObject>
- (NSArray *)treeViewData;
@end

@interface LPTreeView : UITableViewController <LPTreeViewDelegate>

@property (nonatomic, weak) id<LPTreeViewDelegate> delegate;

@end
#import "LPTreeView.h"

@interface InheritanceViewController : UIViewController <LPTreeViewDelegate>

@end
@interface LPTreeViewController : UITableViewController

- (NSArray *)treeViewData;

@end
#import "LPTreeViewController.h"

@interface InheritanceViewController : LPTreeViewController

@end
MainViewController.h

@protocol LPTreeViewDelegate <NSObject>
- (NSArray *)treeViewData;
@end

@interface LPTreeView : UITableViewController <LPTreeViewDelegate>

@property (nonatomic, weak) id<LPTreeViewDelegate> delegate;

@end
#import "LPTreeView.h"

@interface InheritanceViewController : UIViewController <LPTreeViewDelegate>

@end
@interface LPTreeViewController : UITableViewController

- (NSArray *)treeViewData;

@end
#import "LPTreeViewController.h"

@interface InheritanceViewController : LPTreeViewController

@end
无论我尝试什么,我的tableview总是尝试在MainViewController而不是LPTreeView中查找TableViewController强制方法。
谢谢

你完全搞错了

  • LPTreeView
    类重命名为
    LPTreeViewController
    ,因为它不是视图
  • 摆脱
    LPTreeViewDelegate
    协议
  • -(NSArray*)treeViewData方法的声明移动到
    LPTreeViewController
  • LPTreeViewController
    类的
    viewDidLoad
    方法应调用:

    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    
  • 您的
    InheritanceViewController
    类应该扩展
    LPTreeViewController
    ,而不是“UIViewController”
  • InheritanceViewController
    不应符合协议或具有自己的
    tableView
    属性
  • InheritanceViewController
    中的
    viewDidLoad
    应创建
    LPTreeView
    或设置其委托 LPTreeViewController.h

    @protocol LPTreeViewDelegate <NSObject>
    - (NSArray *)treeViewData;
    @end
    
    @interface LPTreeView : UITableViewController <LPTreeViewDelegate>
    
    @property (nonatomic, weak) id<LPTreeViewDelegate> delegate;
    
    @end
    
    #import "LPTreeView.h"
    
    @interface InheritanceViewController : UIViewController <LPTreeViewDelegate>
    
    @end
    
    @interface LPTreeViewController : UITableViewController
    
    - (NSArray *)treeViewData;
    
    @end
    
    #import "LPTreeViewController.h"
    
    @interface InheritanceViewController : LPTreeViewController
    
    @end
    
    LPTreeViewController.m

    #import "LPTreeView.h"
    
    @implementation LPTreeView
    
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        [self populateCurrentData];
    }
    
    
    -(NSArray *)treeViewData {
        return @[];
    }
    
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    ...
    
    @interface InheritanceViewController () 
    @property (weak, nonatomic) IBOutlet UITableView *tableView;
    
    @end
    
    @implementation InheritanceViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        LPTreeView *treeView = [[LPTreeView alloc] init];
        _tableView.dataSource = treeView;
        _tableView.delegate = treeView;
    
    }
    
    -(NSArray *)treeViewData {
        return @[
                 @{@"name": @"Data",
                   @"image": @"Image",
                   @"subcategories": @[ @"One", @"Two", @"Three" ]},
                 @{@"name": @"Data2",
                   @"image": @"Image-1",
                   @"subcategories": @[ @"One", @"Two", @"Three" ]},
                 @{@"name": @"Data3",
                   @"image": @"Image-2",
                   @"subcategories": @[ @"One", @"Two", @"Three" ]},
                 ];
    }
    
    #import "LPTreeViewController.h"
    
    @implementation LPTreeViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        self.tableView.dataSource = self;
        self.tableView.delegate = self;
    
        [self populateCurrentData];
    }
    
    -(NSArray *)treeViewData {
        return @[];
    }
    
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    ...
    
    @implementation InheritanceViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    }
    
    -(NSArray *)treeViewData {
        return @[
             @{@"name": @"Data",
               @"image": @"Image",
               @"subcategories": @[ @"One", @"Two", @"Three" ]},
             @{@"name": @"Data2",
               @"image": @"Image-1",
               @"subcategories": @[ @"One", @"Two", @"Three" ]},
             @{@"name": @"Data3",
               @"image": @"Image-2",
               @"subcategories": @[ @"One", @"Two", @"Three" ]},
             ];
    }
    
    继承视图控制器.h

    @protocol LPTreeViewDelegate <NSObject>
    - (NSArray *)treeViewData;
    @end
    
    @interface LPTreeView : UITableViewController <LPTreeViewDelegate>
    
    @property (nonatomic, weak) id<LPTreeViewDelegate> delegate;
    
    @end
    
    #import "LPTreeView.h"
    
    @interface InheritanceViewController : UIViewController <LPTreeViewDelegate>
    
    @end
    
    @interface LPTreeViewController : UITableViewController
    
    - (NSArray *)treeViewData;
    
    @end
    
    #import "LPTreeViewController.h"
    
    @interface InheritanceViewController : LPTreeViewController
    
    @end
    
    InheritanceViewController.m

    #import "LPTreeView.h"
    
    @implementation LPTreeView
    
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        [self populateCurrentData];
    }
    
    
    -(NSArray *)treeViewData {
        return @[];
    }
    
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    ...
    
    @interface InheritanceViewController () 
    @property (weak, nonatomic) IBOutlet UITableView *tableView;
    
    @end
    
    @implementation InheritanceViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        LPTreeView *treeView = [[LPTreeView alloc] init];
        _tableView.dataSource = treeView;
        _tableView.delegate = treeView;
    
    }
    
    -(NSArray *)treeViewData {
        return @[
                 @{@"name": @"Data",
                   @"image": @"Image",
                   @"subcategories": @[ @"One", @"Two", @"Three" ]},
                 @{@"name": @"Data2",
                   @"image": @"Image-1",
                   @"subcategories": @[ @"One", @"Two", @"Three" ]},
                 @{@"name": @"Data3",
                   @"image": @"Image-2",
                   @"subcategories": @[ @"One", @"Two", @"Three" ]},
                 ];
    }
    
    #import "LPTreeViewController.h"
    
    @implementation LPTreeViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        self.tableView.dataSource = self;
        self.tableView.delegate = self;
    
        [self populateCurrentData];
    }
    
    -(NSArray *)treeViewData {
        return @[];
    }
    
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    ...
    
    @implementation InheritanceViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    }
    
    -(NSArray *)treeViewData {
        return @[
             @{@"name": @"Data",
               @"image": @"Image",
               @"subcategories": @[ @"One", @"Two", @"Three" ]},
             @{@"name": @"Data2",
               @"image": @"Image-1",
               @"subcategories": @[ @"One", @"Two", @"Three" ]},
             @{@"name": @"Data3",
               @"image": @"Image-2",
               @"subcategories": @[ @"One", @"Two", @"Three" ]},
             ];
    }
    

    您的前言提到希望使用继承,但您的mainViewController实现似乎使用了组合。我可以从程序员Stack Exchange站点推荐这两种方法的快速比较吗?谢谢你的回答!这对我帮助很大,但没有达到我想要的目的。问题是我想让它与一个UIViewController兼容,而UIViewController内部恰好有一个TableView,这就是我一直在做协议的原因。例如,我可以在一个视图中有一个表视图和一个图像。谢谢