2012-06-03 3 views
3

я делаю простое приложение, которое рассматривает элементы с сервером JSonошибка, когда добавить UITableViewController, как подвид в UIViewController

я использовал UISegment в одном UIViewController добавить другой подвид

- (IBAction)segmentSwitch:(id)sender { 
    UISegmentedControl *segmentedControl = (UISegmentedControl *) sender; 
    NSInteger selectedSegment = segmentedControl.selectedSegmentIndex; 

    if (selectedSegment == 0) { 
     instantiateViewControllerWithIdentifier:@"prestige"] animated:NO]; 

     UIViewController *subController = [self.storyboard instantiateViewControllerWithIdentifier:@"prestige"]; 
     [mainView addSubview:subController.view]; 

    } 
    else if(selectedSegment == 1) 
    { 
     instantiateViewControllerWithIdentifier:@"latest"]]; 
     //[self setView: [self.storyboard instantiateViewControllerWithIdentifier:@"latest"]]; 
     //UIViewController *subController = [self.storyboard instantiateViewControllerWithIdentifier:@"latest"]; 
     //[mainView addSubview:subController.view]; 

     UITableViewController *tableVC =[self.storyboard instantiateViewControllerWithIdentifier:@"latest"]; 

     [self.view addSubview:tableVC.tableView]; 

    } 
    else if (selectedSegment == 2) 
    { 
     instantiateViewControllerWithIdentifier:@"contactUs"]]; 
     UIViewController *subController = [self.storyboard instantiateViewControllerWithIdentifier:@"contactUs"]; 
     [mainView addSubview:subController.view]; 
    } 
} 

моей ошибка возникает, когда Я выбираю выберите сегмент 2, чтобы просмотреть UITableViewController как подтаблицы х кода дает мне следующую ошибку

EXC_BAD_ACCESS (код = 1 адрес = 0x110ff210 на литий ne NSDictionary * latests = [lastArray objectAtIndex: indexPath.row];

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

    latestCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    NSDictionary *latests = [latestArray objectAtIndex:indexPath.row]; 

    NSString *latest_name_En = [latests objectForKey:@"title_en"]; 
    NSString *logo1 = [latests objectForKey:@"logo"]; 
    NSString *img1 = [latests objectForKey:@"img1"]; 

    NSData *latestsImg1 = [NSData dataWithContentsOfURL:[NSURL URLWithString:img1]]; 
    NSData *latestsLogo1 = [NSData dataWithContentsOfURL:[NSURL URLWithString:logo1]];  

    cell.latest_name_en1.text = latest_name_En; 

    dispatch_async(dispatch_get_main_queue(), ^{ 

     cell.latest_img1.image = [UIImage imageWithData:latestsImg1]; 
     cell.latest_logo1.image = [UIImage imageWithData:latestsLogo1]; 

    }); 

    return cell; 
} 

Я уверен, что UITableViewController работает отлично, как я попытался запустить его в покое, и он работает также попробовал без пользовательских ячейки, и она работала также, но с custon клетки как подвид это дает вышеуказанную ошибку ,

+0

Сообщение любой код, связанный с созданием lastArray, также отправьте код для метода, numberOfRowsInSection –

ответ

0

lastArray не был инициализирован правильно.

Каждый раз, когда вы получаете EXEC_BAD_ACCESS, запустите свой код через Инструмент Зомби. Это укажет на любой проблемный код.

0

Объекты latestsImg1 и latestsLogo1 не сохраняются при их инициализации. Поэтому, когда выполняется блок асинхронного кода, выполненный в dispatch_async, эти значения, вероятно, уже выпущены и более недействительны. Таким образом, когда асинхронный блок выполняет эти два указателя, они бросаются в забвение. Я предлагаю либо не выполнять эти два назначения через диспетчер GrandCentral, либо если вы должны сделать их асинхронно, а затем сохранить их после создания и освободить их в блоке async.

Что-то вроде:

NSData * latestsImg1 = [NSData dataWithContentsOfURL: [NSURL URLWithString: img1]]; [latestsImg1 сохранить]; NSData * latestsLogo1 = [NSData dataWithContentsOfURL: [NSURL URLWithString: logo1]];
[latestsLogo1 сохранить]; cell.latest_name_en1.text = latest_name_En;

dispatch_async(dispatch_get_main_queue(), ^{ 

    cell.latest_img1.image = [UIImage imageWithData:latestsImg1]; 

cell.latest_logo1.image = [UIImage imageWithData:latestsLogo1]; 
[latestsImg1 release]; 
    [latestLogo1 release]; 

}); 
+0

Я пробовал, но используя save дает ошибку – user1434025

14

спасибо за помощь

я, наконец, понять это я

[self addChildViewController:subController]; 
[mainView addSubview:subController.view]; 

добавить TableView к ViewController, как подвид

и работал

+0

Это действительно сработало для меня. Спасибо приятель. – Humayun

+0

'addChildViewController:' отлично работал и для меня. –

+0

действительно фантастический отзыв, спасибо. обратите внимание, что вам часто приходится получать рамку «только нужного размера». хороший трюк, посмотрите, какой размер он имеет, когда UITableView «не» завернут, и тем самым вы знаете, что его установить, когда оно «завершено» (если вы хотите его полноэкранный). еще раз спасибо. – Fattie

Смежные вопросы