Программирование на iPhone: чтение нескольких UITableView из одного и того же источника? - PullRequest
1 голос
/ 08 ноября 2010

Этот вопрос связан с проблемой UITableView при использовании отдельного делегата / источника данных , хотя у меня другая проблема. Я только начинаю изучать программирование на iPhone.

В основном у меня есть один основной вид с таблицей. В случае щелчка по ячейке отображается вложенное представление с другой таблицей.

Источник данных и делегат для таблицы основного представления установлены в качестве владельца файлов, и я добавил туда необходимый код для обработки данных таблицы, и все в порядке. Но когда кажется, что вторая таблица во вспомогательном представлении приводит к сбою приложения, я сделал то же самое, установил источник данных и делегировал владельцу файла и повторил ту же процедуру, что и для таблицы основного представления. Я понятия не имею, почему это происходит.

Подвид имеет только один файл nib / xib и собственный выход. Если я не присоединяю какой-либо источник данных к таблице подпредставления, он берет данные из таблицы основного представления; Я не понимаю, почему это так, поскольку я установил источник данных в качестве владельца файла.

Например: у контроллера FirstView есть таблица FirstTable, источник данных и делегат установлены на владельца Files. Я добавил следующее в FirstView.m:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 4;
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"LibraryListingCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                       reuseIdentifier:CellIdentifier] autorelease];
    }
    cell.textLabel.text =@"Table Cell";
    return cell;
}

Все работает отлично. В тот момент, когда я повторяю это со второй таблицей и вторым представлением, приложение вылетает со словами

reason: '-[UISectionRowData tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0x69188d0'

Я сделал то же самое для второй таблицы: реализовал numberOfRowsInSection и cellForRowAtIndexPatch внутри secondview.m и установил делегат и источник данных второй таблицы для владельца файла. Если я удалю делегат и источник данных для второй таблицы, приложение не будет аварийно завершено, но будет иметь пустую таблицу во втором представлении.

Есть предложения? или мне здесь не хватает ключевой концепции?

Ответы [ 3 ]

3 голосов
/ 08 ноября 2010

Вы можете использовать один и тот же источник данных и методы делегирования для нескольких таблиц. Вы должны указать, в какой таблице вы выполняете операции. Например:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([tableView isEqual:TableView1])
    {
       //do work for tableview1
     }
     else if([tableView isEqual:TableView2])
   {
      //do operations for tableview2
   }
}
1 голос
/ 01 сентября 2011

У меня была ТОЧНАЯ та же проблема, и я исправил ее, удалив свое соединение из источника данных табличного представления с владельцем файлов. Затем я вставил приведенный ниже код, заменив существующий cellForRowAtIndexPath. Мне пришлось изменить имя массива, чтобы оно соответствовало моему массиву, а затем снова подключить источник данных к владельцу файлов, и он начал работать. Должно быть, где-то был snafu в моем коде функции.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"CellIdentifier";
    // Dequeue or create a cell of the appropriate type.
    // UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        cell.accessoryType = UITableViewCellAccessoryNone;
        cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
        cell.textLabel.numberOfLines = 0;
        [cell.textLabel sizeToFit];
    }
    cell.textLabel.text=[array objectAtIndex:indexPath.row];
    return cell;
}
1 голос
/ 10 ноября 2010

Это главный файл View .h file.

#import <UIKit/UIKit.h>
#import "SubView.h"
@interface StackOverTableSubViewViewController : UIViewController <UITableViewDelegate,UITableViewDataSource>
{
    UIView *contentView;
    UITableView *tblVw;
    NSMutableArray *array;
    SubView *SubViewObj;
}
@property(nonatomic,retain) UIView *contentView;
@property(nonatomic,retain) UITableView *tblVw;
@property(nonatomic,retain) NSMutableArray *array;
@property(nonatomic,retain) SubView *SubViewObj;
@end

Это главный контроллер View .m file.

#import "StackOverTableSubViewViewController.h"
@implementation StackOverTableSubViewViewController
@synthesize contentView,tblVw,array,SubViewObj;

// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView
{
    contentView=[[UIView alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
    contentView.autoresizingMask=(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
    contentView.autoresizesSubviews=YES;
    contentView.backgroundColor=[UIColor whiteColor];

    tblVw=[[UITableView alloc]initWithFrame:[[UIScreen mainScreen]bounds] style:UITableViewStylePlain];
    tblVw.dataSource=self;
    tblVw.delegate=self;
    tblVw.scrollEnabled=YES;

    array=[[NSMutableArray alloc]init];
    [array addObject:@"Row1"];
    [array addObject:@"Row2"];
    [array addObject:@"Row3"];
    [array addObject:@"Row4"];
    [array addObject:@"Row5"];
    [array addObject:@"Row6"];
    [array addObject:@"Row7"];
    [array addObject:@"Row8"];
    [array addObject:@"Row9"];
    [array addObject:@"Row10"];
    [array addObject:@"Row11"];
    [array addObject:@"Row12"];
    [contentView addSubview:tblVw];
    self.view=contentView;
}

- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section
{
    return [array count];
}

// Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier:
// Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"CellIdentifier";

    // Dequeue or create a cell of the appropriate type.
    // UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        cell.accessoryType = UITableViewCellAccessoryNone;
        cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
        cell.textLabel.numberOfLines = 0;
        [cell.textLabel sizeToFit];
    }
    cell.textLabel.text=[array objectAtIndex:indexPath.row];
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    SubViewObj=[[SubView alloc]init];
    [self.view addSubview:SubViewObj.view];
}

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

// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)dealloc {
    [contentView release];
    [SubViewObj release];
    [tblVw release];
    [array release];
    [super dealloc];
}

@end

Добавить контроллер вида под названием subview. Вот subview.h:

#import <UIKit/UIKit.h>
@interface SubView : UIViewController <UITableViewDelegate,UITableViewDataSource>
{
    UIView *contentView;
    UITableView *tblVw;
    NSMutableArray *array;
}
@property(nonatomic,retain) UIView *contentView;
@property(nonatomic,retain) UITableView *tblVw;
@property(nonatomic,retain) NSMutableArray *array;
@end

И subview.m: #import "SubView.h" #Импортировать @implementation SubView @synthesize contentView, tblVw, array;

// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
    contentView=[[UIView alloc]initWithFrame:CGRectMake(200, 10, 300, 600)];
    contentView.autoresizingMask=(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
    contentView.autoresizesSubviews=YES;
    contentView.backgroundColor=[UIColor whiteColor];

    tblVw=[[UITableView alloc]initWithFrame:CGRectMake(200, 10, 300, 600) style:UITableViewStylePlain];
    tblVw.dataSource=self;
    tblVw.delegate=self;
    tblVw.scrollEnabled=YES;
    tblVw.layer.borderWidth=4.0;
    tblVw.layer.borderColor=[[UIColor redColor]CGColor];
    array=[[NSMutableArray alloc]init];
    [array addObject:@"Data1"];
    [array addObject:@"Data2"];
    [array addObject:@"Data3"];
    [array addObject:@"Data4"];
    [array addObject:@"Data5"];
    [array addObject:@"Data6"];
    [array addObject:@"Data7"];
    [array addObject:@"Data8"];
    [array addObject:@"Data9"];
    [array addObject:@"Data10"];
    [array addObject:@"Data11"];
    [array addObject:@"Data12"];

    [contentView addSubview:tblVw];
    self.view=contentView;

}

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

- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section
{
    return [array count];
}

// Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier:
// Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"CellIdentifier";

    // Dequeue or create a cell of the appropriate type.
    // UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        cell.accessoryType = UITableViewCellAccessoryNone;
        cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
        cell.textLabel.numberOfLines = 0;
        [cell.textLabel sizeToFit];
    }
    cell.textLabel.text=[array objectAtIndex:indexPath.row];
    return cell;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Overriden to allow any orientation.
    return YES;
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)dealloc {
    [super dealloc];
}

@end

Попробуйте этот код. Это приложение было сделано для iPad. Измените размеры, необходимые для iPhone.

...