Какао: Почему мой вид таблицы пуст? - PullRequest
3 голосов
/ 16 мая 2009

Почему мой табличный вид пуст? Это было нормально, пока я не добавил "initWithStyle"

Вот как это выглядит:

alt text

А вот как выглядит мой код:

Вот мой .h:

#import <UIKit/UIKit.h>


@interface TableViewController : UITableViewController {

NSMutableArray *jokes;
IBOutlet UITableView *jokeTableView; 


 }

@property (nonatomic, retain) NSMutableArray *jokes;
@property (retain) UITableView *jokeTableView;

@end

А вот мой файл реализации:

#import "TableViewController.h"
#import "Joke.h"

@implementation TableViewController
@synthesize jokes;
@synthesize jokeTableView;

- (void)awakeFromNib {
[jokeTableView init];
}




- (id)initWithStyle:(UITableViewStyle)style {
if (self = [super initWithStyle:style]) {
    self.jokes = [NSMutableArray arrayWithObjects:
                  [Joke jokeWithValue:@"If you have five dollars     and Chuck Norris has five dollars, Chuck Norris has more money than you"],
                  [Joke jokeWithValue:@"There is no 'ctrl' button on Chuck Norris's computer. Chuck Norris is always in control."],
                  [Joke jokeWithValue:@"Apple pays Chuck Norris 99 cents every time he listens to a song."],
                  [Joke jokeWithValue:@"Chuck Norris can sneeze with his eyes open."],
                  nil];

    self.jokeTableView.rowHeight = 30.0;
    // self.jokeTableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
    self.jokeTableView.sectionHeaderHeight = 0;
}
return self;
}



- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { // Saying how many sections wanted (Just     like in address, where sorts by first name)
return 1;
}

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


- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Team";  
UITableViewCell *cell = 
[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] 
             initWithFrame:CGRectZero 
             reuseIdentifier:CellIdentifier] autorelease];
}
Joke *j = (Joke *)[jokes objectAtIndex:indexPath.row];
if( j )
    cell.text = j.joke;
return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
}


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

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

- (BOOL)shouldAutorotateToInterfaceOrientation:
(UIInterfaceOrientation)interfaceOrientation {
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

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

- (void)dealloc {
[jokes release];
[jokeTableView release];
[super dealloc];
}

@end

Ответы [ 6 ]

5 голосов
/ 20 мая 2009

Если ваш контроллер вида загружается из пера, вам нужно переопределить метод initWithCoder:, а не initWithStyle:.

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

См. Apple Docs на awakeFromNib: для получения подробной информации об экземпляре объекта из перьев Кроме того, если у вас есть доступ к бета-версии 3.0, выполните поиск по awakeFromNib:, обновленная формулировка даст лучшее объяснение того, какие методы вызываются и когда.

P.S. Вы не должны вызывать [jokeTableView init] в своем коде, это будет сделано автоматически, когда перо распаковано.

Редактировать: Поскольку вы устанавливаете свойства для своего табличного представления из своего кода инициализации, это определенно должно быть в awakeFromNib:, а не initWithCoder: или initWithStyle:.

Глядя на скриншот, вы также можете убедиться, что с помощью Interface Builder UITableView правильно размещен в файле nib для вашего контроллера представления и что код (или nib), который создает ваш контроллер представления, ссылается на правый файл пера - если бы не были загружены только данные для табличного представления, вы бы увидели серые линии между пустыми ячейками, а не просто пустое пространство, как на этом изображении.

2 голосов
/ 16 мая 2009

Я не знаю, является ли это причиной вашей проблемы, но случайное [jokeTableView init] в awakeFromNib определенно неверно и может вызвать такие проблемы. init никогда не следует вызывать без присоединенного alloc*, и в этом случае я сомневаюсь, что любой из них необходим, поскольку табличное представление предположительно уже было создано в другом месте.

(* Единственное исключение из этого правила, очевидно, когда вы переопределяете метод init и вызываете super.)

2 голосов
/ 16 мая 2009

initWithStyle не совпадает с initWithCoder. Ваш конструктор, вероятно, даже не вызывается.

1 голос
/ 16 мая 2009

Что ж, если вы инициализируете этот контроллер с помощью initWithStyle и ранее вызывали initWithCoder, это ваша проблема.

Вы загружаете свой self.jokes в initWithCoder. Вы должны переместить этот код в viewDidLoad или в свой новый initWithStyle метод

// move this
self.jokes = [NSMutableArray arrayWithObjects:
                                  [Joke jokeWithValue:@"If you have five dollars and Chuck Norris has five dollars, Chuck Norris has more money than you"],
                                  [Joke jokeWithValue:@"There is no 'ctrl' button on Chuck Norris's computer. Chuck Norris is always in control."],
                                  [Joke jokeWithValue:@"Apple pays Chuck Norris 99 cents every time he listens to a song."],
                                  [Joke jokeWithValue:@"Chuck Norris can sneeze with his eyes open."],
                                  nil];
0 голосов
/ 19 мая 2009

Я думаю, что главная проблема в том, что вам нужно заменить:

- (id)initWithStyle:(UITableViewStyle)style {
    if (self = [super initWithStyle:style]) {

(и закрывающая скобка)

с

- (void)viewDidLoad {

Кроме того, вам не нужно заканчивать NSMutableArray с помощью nil.

0 голосов
/ 19 мая 2009

Избавьтесь от этого:

- (void)awakeFromNib {
[jokeTableView init];
}

вы уже делаете инициализацию в initWithStyle:

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