Objective-C: не могу заполнить UITableView - попробовал все - PullRequest
0 голосов
/ 20 сентября 2011

Я пытаюсь заполнить простой uitableview в XCode 4.1.

Вот сообщенияInbox.h:

#import <UIKit/UIKit.h>

@interface MessagesInbox : UITableViewController <UITableViewDelegate,UITableViewDataSource>{
    NSMutableArray *listData;
    IBOutlet UITableView *table;
}
@property (nonatomic,retain) UITableView *table;
@property (nonatomic, retain) NSArray *listData;

@end

Вот сообщенияInbox.m:

#import "MessagesInbox.h"

@implementation MessagesInbox
@synthesize listData,table;

- (void)loadView{   
}

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (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.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.listData = [[NSArray alloc] initWithObjects:@"Red", @"Green", @"Blue", @"Indigo", @"Violet", nil];

}

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

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

#pragma mark - Table view data source

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return [self.listData count];
}

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell...

    cell.textLabel.text = [listData objectAtIndex:indexPath.row];
    return cell;
}

/*
// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Return NO if you do not want the specified item to be editable.
    return YES;
}
*/

/*
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the row from the data source
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }   
    else if (editingStyle == UITableViewCellEditingStyleInsert) {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
    }   
}
*/

/*
// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
{
}
*/

/*
// Override to support conditional rearranging of the table view.
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Return NO if you do not want the item to be re-orderable.
    return YES;
}
*/

#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Navigation logic may go here. Create and push another view controller.
    /*
     <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
     // ...
     // Pass the selected object to the new view controller.
     [self.navigationController pushViewController:detailViewController animated:YES];
     [detailViewController release];
     */
}
- (void)dealloc {

    [listData release];
    [super dealloc];
}
@end

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

Я подключил делегата и источника данных tableview к владельцу файла.

Любая помощь с благодарностью,

Редактировать -------------------

Вот мои связи:

enter image description here

Ответы [ 5 ]

5 голосов
/ 20 сентября 2011

Вы возвращаете ноль разделов - у вас должен быть хотя бы один.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}
3 голосов
/ 20 сентября 2011

Вы возвращаете 0 как количество секций!Вы должны вернуть хотя бы 1 раздел, если хотите отобразить какие-либо данные таблицы.

2 голосов
/ 20 сентября 2011

Вы переопределяете метод -loadView, который не позволяет вашему базовому классу (UITableViewController) загрузить фактический UITableView.

Удалите этот метод, и вы увидите табличное представление.

1 голос
/ 20 сентября 2011

Я вижу здесь две странные вещи:

[1] возвращено 0 секций; Вы должны определить хотя бы 1 раздел для работы

[2] вы используете другую таблицу поверх свойства tableView, определенного классом UITableViewController. Вы должны проверить, не противоречат ли эти две таблицы каким-либо образом (искренне я никогда не пытался поместить другую таблицу поверх «стандартной» таблицы контроллера). Просто сделайте эту дополнительную проверку, отличную от решения в [1].

Это снимок из документов Apple в качестве ссылки:

Если файл пера указан с помощью initWithNibName: bundle: метод (который объявлен суперклассом UIViewController), UITableViewController загружает табличное представление, заархивированное в файле пера. В противном случае он создает ненастроенный объект UITableView с правильными размерами и маской авторазмера. Вы можете получить доступ к этому представлению через свойство tableView. Если загружен файл пера, содержащий табличное представление, источник данных и делегат становятся теми объектами, которые определены в файле пера (если есть). Если файл пера не указан или если в файле пера не указан источник данных или делегат, UITableViewController устанавливает для источника данных и делегата табличного представления значение self. Когда табличное представление собирается появиться в первый раз, когда оно загружено, контроллер табличного представления перезагружает данные табличного представления. Он также очищает свой выбор (с анимацией или без нее, в зависимости от запроса) каждый раз, когда отображается представление таблицы. Класс UITableViewController реализует это в методе суперкласса viewWillAppear :. Вы можете отключить это поведение, изменив значение в свойстве clearsSelectionOnViewWillAppear. Когда табличное представление появилось, контроллер мигает индикаторами прокрутки табличного представления. Класс UITableViewController реализует это в методе суперкласса viewDidAppear :. Он реализует метод суперкласса setEditing: animated: так, что если пользователь нажимает кнопку Edit | Done на панели навигации, контроллер переключает режим редактирования таблицы. Вы создаете пользовательский подкласс UITableViewController для каждого табличного представления, которым хотите управлять. Когда вы инициализируете контроллер в initWithStyle:, вы должны указать стиль табличного представления (простой или сгруппированный), которым должен управлять контроллер. Поскольку изначально созданное табличное представление не имеет измерений таблицы (то есть количества разделов и количества строк в разделе) или содержимого, источник данных и делегат табличного представления, то есть сам объект UITableViewController, должен обеспечивать измерения таблицы, содержимое ячейки и любые желаемые конфигурации (как обычно). Вы можете переопределить loadView или любой другой метод суперкласса, но если вы обязательно вызовете реализацию метода суперкласса, обычно в качестве первого вызова метода.

0 голосов
/ 20 сентября 2011

Остальные ответы верны.

  1. Вы не должны переопределять loadView без вызова [super loadView].
  2. Вам необходимо вернуть> 0 для количества секций в numberOfSectionsInTableView. Вам нужен ваш iVar table. tableView iVar определяется UITableViewController.
  3. У вас также есть утечка памяти, когда вы выделяете listData.

    self.listData = [[NSArray alloc] initWithObjects:@"Red", @"Green", @"Blue", @"Indigo", @"Violet", nil];

Приведенный выше код сохранит массив дважды. Вы должны изменить одно из:

self.listData = [NSArray arrayWithObjects:@"Red", @"Green", @"Blue", @"Indigo", @"Violet", nil];

или

listData = [[NSArray alloc] initWithObjects:@"Red", @"Green", @"Blue", @"Indigo", @"Violet", nil];

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...