UITableView numberOfRowsInSection не будет загружать более одной строки - PullRequest
2 голосов
/ 03 января 2012

Итак, у меня есть UITableView, который должен пройти через один NSMutableArray и использовать каждый из них в качестве меток строки.В настоящее время единственный способ, которым я могу заставить это работать, состоит в том, чтобы 0 или 1 строка, 2 или выше, выдает ошибку, говоря, что индекс массива выключен.Я попытался NSLog вывести мой массив и могу подтвердить, что он читает все строки.

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

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

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

}

- (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];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}

// Set up the cell...
NSString *cellValue = [harvestRecipeList objectAtIndex:indexPath.row];
cell.textLabel.text = cellValue;

return cell;
} 

Код массива хранится в том же файле (MasterViewController.m), который я добавил ниже.

- (void)viewDidLoad
{
    [super viewDidLoad];

    harvestRecipeList = [[NSMutableArray alloc] init];

    [harvestRecipeList addObject:@"Ice Cream"];
    [harvestRecipeList addObject:@"Walnut Cake"];
    [harvestRecipeList addObject:@"Cookies"];
    [harvestRecipeList addObject:@"Salad"];
    [harvestRecipeList addObject:@"Grilled Fish"];

    //Set the title
    self.navigationItem.title = @"BTN Recipes";
}

Я бы хотел любую помощь по этому поводу, это меня беспокоит.Я использовал [cropRecipeList count] , но это выдает ту же ошибку индекса массива.И как я уже упоминал, я могу заставить приложение работать отлично с 0 или 1 строкой - заранее спасибо за любую помощь!

РЕДАКТИРОВАТЬ: вот ошибка, которую я получаю в окне вывода после сборки:

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

EDIT2 : включено ниже настройки моего свойства для HarvestRecipeList

//MasterViewController.h
@interface MasterViewController : UITableViewController {
    NSMutableArray *harvestRecipeList;
}
@property (nonatomic, retain) NSMutableArray *harvestRecipeList;

// and also my MasterViewController.m 
@synthesize harvestRecipeList;

EDIT3 Вот мой исходный код, сжатый для этого проекта.Он называется treehouse, пока что только для тестирования, но вы можете dl из моего облачного приложения здесь .

Ответы [ 4 ]

5 голосов
/ 03 января 2012
Updated Solution:

Итак, я проверил ваш код и обнаружил проблему. Сделайте следующее:

  1. Зайдите в раскадровку и выберите Master Table View (щелкните там, где написано Static Content)
  2. Нажмите на инспектор атрибутов (выглядит как стрелка вниз) и измените содержимое с Static Cells на Dynamic Prototypes
  3. Нажмите на ячейку прототипа и введите Cell в поле Идентификатор (это то, что вы используете в качестве идентификатора ячейки
  4. Также измените Аксессуар с None на Disclosure Indicator
  5. В вашем tableView:numberOfRowsInSection возвращении self.harvestRecipeList.count
  6. В tableView:cellForRowAtIndexPath: вы можете удалить следующие две строки (как они предоставлены раскадровкой):

    cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: CellIdentifier]; cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

  7. Воссоздайте свою передачу Push из вашей мастер-ячейки в контроллер подробных представлений

Теперь все должно работать нормально - и я проверил, что это работает. Основная проблема заключалась в том, что вы указали статические ячейки, а не динамические прототипы, а остальные инструкции просто зачистили. Исключение NSRangeException было вызвано наличием только одной ячейки, поэтому это было все, что отображалось.

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

Previous Solution:

Итак, несколько комментариев, но, во-первых, если вы обновили свой код, можете ли вы опубликовать обновление?

  1. Ваш harvestRecipeList, к которому вы добавляете объекты в ViewDidLoad, не похож на тот harvestRecipeList, который вы синтезировали - он будет локальным для метода, поэтому ваша переменная экземпляра всегда будет равна нулю. Вы всегда должны использовать self.harvestRecipeList - делайте это везде. Это может легко объяснить ваш NSRangeException. Также см. № 4 ниже.
  2. В вашем tableView:numberOfRowsInSection: вы должны вернуть self.harvestRecipeList.count
  3. Если вы используете iOS5 SDK, вам не нужно проверять, гарантированно ли cell == nil, как dequeueReusableCellWithIdentifier:, возвращать ненулевую ячейку. Вам нужно проверить, используете ли вы iOS4 SDK.
  4. Измените @synthesize harvestRecipeList; на @synthesize harvestRecipeList = _harvestRecipeList;, так как это поможет с № 1 и проверкой вашего доступа к ивару.

Попробуйте #1 & #2 как минимум, а затем опубликуйте обновление о своих проблемах. Надеюсь, это поможет.

2 голосов
/ 03 января 2012

Я проверил код, который вы положили в файл ZIP.Я сразу заметил, что вы используете функцию раскадровки iOS 5.У меня нет ни Xcode 4, ни iOS 5 SDK, поэтому я не смог протестировать эту часть вашего приложения.

Однако я продолжил и кодировал вашу часть раскадровки вручную.Я проверил ваш MasterViewController исключительно и не нашел ошибок.Я добавил в AppDelegate этот метод, чтобы заменить автоматические функции раскадровки и просто показать контроллер представления, откуда, по вашему мнению, происходит ошибка.

- (BOOL)application:(UIApplication *)application 
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    MasterViewController *myVC;
    _window = [[UIWindow alloc] initWithFrame:
               [[UIScreen mainScreen] applicationFrame]];
    myVC = [[MasterViewController alloc] initWithStyle:UITableViewStylePlain];
    [_window setAutoresizesSubviews:YES];
    [_window addSubview:myVC.view];

    [_window makeKeyAndVisible];
    return YES;
}

Чтобы доказать, что MasterViewController.m не содержит ошибок,добавьте этот снимок экрана:

enter image description here

Вывод: Ваша ошибка может быть найдена где-то еще, возможно, в вашем файле раскадровки.Однако я никогда не использовал эту новую функциональность, поэтому не могу помочь вам с этим.Я предлагаю вам просмотреть раскадровку и обратить все внимание на этот файл.

1 голос
/ 03 января 2012

Хорошо, если ваши сообщения журнала отображают массив с пятью объектами непосредственно перед тем, как вы пытаетесь запросить второй, и ваше приложение дает вам NSRangeException, ошибка определенно не найдена в коде, который вы нам показываете. *

Попробуйте найти его, разместив различные журналы до и после любого -[NSArray objectAtIndex:] и посмотрите, какой журнал не просматривается после вызова. Там твоя ошибка.

Помните, что вы можете использовать

NSLog(@"%s", __PRETTY_FUNCTION__);

, чтобы показать, откуда поступает сообщение. Также существует макрос строки и файла, но обычно макрос функции должен вам помочь.

Пример:

NSLog(@"%s Before", __PRETTY_FUNCTION__);
[myArray objectAtIndex:anIndex];
NSLog(@"%s After", __PRETTY_FUNCTION__);

Если ваше второе сообщение в журнале не пришло, значит, вы нашли ошибку.

0 голосов
/ 03 января 2012

Всегда лучше использовать методы setter и getter для переменных вашего экземпляра.Он заботится о многих проблемах.Я думаю, это ваша проблема.Поэтому везде, где вы хотите использовать harvestRecipeList, используйте self.harvestRecipeList. Было бы полезно узнать, какова ваша декларация свойства для HarvestRecipeList

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