从主ViewController中分离UITableView的委托/数据源

时间:2014-06-26 12:20:38

标签: iphone objective-c cocoa-touch uitableview

我对iOS开发很陌生。我已经阅读了ViewControllers变得庞大的问题,并希望遵循我在上一个问题UITableView issue when using separate delegate/dataSource的答案中看到的设计,我的应用程序有两个不同的表和一对按钮屏幕。但不知怎的,我在TestTableViewController和TestTableTestViewController之间的故事板连接中感到困惑。

任何人都可以提供示例工作项目或一些屏幕截图,介绍如何将UITableView委托,数据源和连接插座连接到故事板中的单独自定义UIViewController子类(TestTableTestViewController)请?

此外,此设计是否适用于xCode 5 / iOS 7及更高版本?

注意:对于那些搬到Swift的人,我强烈建议使用swift扩展名代表&数据源,实际上是按照“分组”的方式继承的类或协议的任何其他实现。 Natasha The Robot的博客文章here

2 个答案:

答案 0 :(得分:2)

按住Ctrlclick + hold + drag项目,将其设置为.h文件。它会自己连接你只需要命名它们。 See This Video Tutorial

另请查看这些教程

Link 1

Link 2

答案 1 :(得分:2)

您必须创建另一个名为MyTableViewDataSource的类,并在其中实现TabbleViewDataSource方法。创建数据源类的属性。在ViewController中设置数据源 这是考试:

@interface MyTableViewDataSource ()
@property (nonatomic, assign) int sectionOneRows;
@property (weak) id<YourDelegate> delegate;
@property (nonatomic, strong) NSArray *dataSourceArray;
@end

@implementation MyTableViewDataSource
@synthesize delegate=_delegate;

-(id) initDataSourceWithdArray:(NSArray *)array
                                            delegate:(id)delegate
{
    if (self = [super init]) {
        self.dataSourceArray=array;
        self.delegate = delegate;
    }
    return self;
}

#pragma mark - UITableViewDataSource

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return numberOfRows;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cellToReturn = nil;
    //Your code here
    return cellToReturn
}

#pragma mark - UITableView Delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    //Your logic here
    //implement the delegate method in you ViewController
        [self.delegate performSelector:@selector(loadDetailsAtIndexPath:)withObject:indexPath];
    }
}

ViewController

self.myDataSource = [[MyTableViewDataSource alloc] initDataSourceWithdArray:self.dataArray delegate:self];
[self.myTableView setDataSource:self.myDataSource];
[self.myTableView setDelegate:self.myDataSource];
[self.myTableView reloadData];

您的委托方法:

-(void)loadDetailsAtIndexPath:(NSIndexPath *)indexPath
{
    MyDetailViewController *myDetailController = [[MyDetailViewController alloc] initWithNibName:@"MyDetailViewController" bundle:nil];
    //Your logic here
    [self.navigationController pushViewController:myDetailController animated:YES];
}

转到Connections Inspector并进行如下更改:

enter image description here

tableView的数据源将在此处以编程方式设置,而不是在IB中。 我希望这能帮到您。