Массив xcode массивов и UITableView - PullRequest
1 голос
/ 20 марта 2012

Я новичок в программировании на Xcode и Objective-C и мне нужна помощь.

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

Программа компилируется, но я получаю SIGABRT ошибка при запуске программы.Может кто-нибудь помочь мне исправить SIGABRT и передать mainArray второму tableView?

Вот как далеко я прошел.

Мой код:

ArrayTableViewController.h

@interface arrayTableViewController : UITableViewController
@property (nonatomic, strong) NSMutableArray *mainArray;
@property (nonatomic, strong) NSMutableArray *secondArray;
@property (nonatomic, strong) NSMutableArray *thirdArray;
@end

ArrayTableViewController.m

#import "ArrayTableViewController.h"
#import "table2.h"
@implementation arrayTableViewController
@synthesize mainArray, secondArray, thirdArray;

-(void) viewDidLoad {
[super viewDidLoad];
mainArray = [[NSMutableArray alloc] initWithObjects: secondArray,     thirdArray, nil];
secondArray = [[NSMutableArray alloc] initWithObjects: @"123", @"456",     nil];
thirdArray = [[NSMutableArray alloc] initWithObjects: @"78", @"90", nil];
}



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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [mainArray 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];
}


cell.textLabel.text = [mainArray objectAtIndex:[indexPath row]];

return cell;
}

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

table2 *table2Controller = [[table2 alloc] initWithNibName:@"table2" bundle:nil];
table2Controller.arrayForDisplay = [[mainArray objectAtIndex: [indexPath row]] objectAtIndex:1];
[self.navigationController pushViewController:table2Controller animated:YES];

}

@end

table2.h

#import <UIKit/UIKit.h>
@interface table2 : UITableViewController
@property (nonatomic, strong) NSArray *arrayForDisplay;
@end

table2.m

@implementation table3
@synthesize arrayForDisplay;

Тогда тот же стиль конфигурации ячеек, который использовался в ArrayTableViewController.m

Редактирование:

После внесения необходимых изменений, когда я запускаю программу и выбираю строку, я получаю ошибку SIGABRT в следующей строке.

int main(int argc, char *argv[])
{
@autoreleasepool {
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([ArrayTableAppDelegate class]));
}
}

Что бы вы порекомендовали?Должен ли я выключить ARC и вызвать свои собственные релизы?чтобы я мог добраться до второго tableView?

1 Ответ

3 голосов
/ 20 марта 2012

Первая ошибка:

В методе viewDidLoad вы создали mainArray с secondArray и thirdArray в качестве элементов еще до того, как вы выделили эти массивы.

Вторая ошибка:

В cellForRowAtIndexPath: метод:

Проверьте строку cell.textLabel.text = [mainArray objectAtIndex:[indexPath row]];

На самом деле textLabel ожидаетЗначение NSString для установки.Но вы устанавливаете массив.

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

Установите значение textLabel следующим образом:

cell.textLabel.text = [[mainArray objectAtIndex:[indexPath row]] objectAtIndex:0];

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

Edit 2:

arrayForDisplay - переменная массива, но вы устанавливаете строковую переменную в оператор

table2Controller.arrayForDisplay = [[mainArray objectAtIndex: [indexPath row]] objectAtIndex:1];

Сделайте это следующим образом:

table2Controller.arrayForDisplay = [mainArray objectAtIndex: [indexPath row]];
...