iOS Xcode 4.2 Мастер-детальный шаблон приложения Бросок NSRangeException - PullRequest
1 голос
/ 07 декабря 2011

Вопрос новичка здесь ...

Я создал проект приложения Master-Detail в Xcode 4.2, используя ARC и раскадровку. Я изменил шаблон так:

MasterViewController.h

#import <UIKit/UIKit.h>

@class DetailViewController;

@interface MasterViewController : UITableViewController
{
    NSMutableArray *items;
}

@property (strong, nonatomic) DetailViewController *detailViewController;
@property (strong, nonatomic) NSMutableArray *items;

@end

MasterViewController.m (фрагменты)

....
@synthesize items;
....
- (void)viewDidLoad
{
    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.
    self.detailViewController = (DetailViewController)[[self.splitViewController.viewControllers lastObject] topViewController];

    items = [[NSMutableArray alloc] initWithObjects:@"item 1", @"item 2", nil];

    [self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionMiddle];
}
....
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [items count];
}

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

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    return @"Test Section";
}

- (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];
    }

    // Configure the cell.
    cell.textLabel.text = [items objectAtIndex:indexPath.row];

    return cell;
}

Этот код не будет работать в этой строке при запуске программы:

[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionMiddle];

с этим исключением:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]'

Если я сокращу список (элементы) до одного элемента, MasterViewController загрузится без ошибок. Я, очевидно, делаю что-то не так, но не могу понять, что это такое. Кто-нибудь хочет указать на очевидное для меня?

1 Ответ

4 голосов
/ 07 декабря 2011

Шаблон включает в себя UITableView, который настроен для статических ячеек. И это на самом деле одна статическая ячейка. (именно поэтому создание массива на один элемент в долгое время приводит к такой работе)

Но, похоже, вам здесь не нужен статический контент. Поэтому вам просто нужно перейти в раскадровку, выбрать UITableView, перейти к инспектору атрибутов и изменить тип содержимого на «Динамические прототипы».

Это поможет вам справиться с этой проблемой.

EDIT

Несколько связанная с этим проблема заключается в том, что вы, вероятно, также хотите использовать ячейку прототипа в раскадровке. Для этого просто установите для идентификатора ячейки этого прототипа идентификатор ячейки, который вы используете в tableView: cellForRowAtIndexPath:.

А затем пропустите всю часть if (cell == nil). Ячейка не будет равна нулю.

Теперь этот метод будет выглядеть так:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell"; // <-- Make sure this matches what you have in the storyboard

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Configure the cell.
    cell.textLabel.text = [self.items objectAtIndex:indexPath.row];

    return cell;
}

Надеюсь, это поможет.

...