在 uiviewcontroller 中添加 uitableviewcontroller 作为子视图时出错

Posted

技术标签:

【中文标题】在 uiviewcontroller 中添加 uitableviewcontroller 作为子视图时出错【英文标题】:error when add uitableviewcontroller as subview in uiviewcontroller 【发布时间】:2012-06-03 21:38:54 【问题描述】:

我正在做一个从 json 服务器查看项目的简单应用程序

我在一个 UIViewController 中使用 UISegment 来添加不同的子视图

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

当我选择选择 Segment 2 以将 uitableviewcontroller 视为子视图时出现错误 x 代码给我以下错误

exc_bad_access (code=1 address=0x110ff210 on line NSDictionary *latests = [latestArray 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 工作正常,因为我尝试单独运行它,它也可以在没有自定义单元格的情况下尝试它,它也可以工作,但是使用自定义单元格作为子视图会出现上述错误。

【问题讨论】:

贴出任何与创建latestArray相关的代码,也请贴出方法numberOfRowsInSection的代码 【参考方案1】:

感谢您的帮助

我终于知道我用过了

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

将tableview作为子视图添加到viewcontroller

成功了

【讨论】:

非常棒的小费,谢谢。请注意,您通常必须让框架“大小合适”。一个好技巧是,查看 UITableView “未”包裹时的大小,这样您就知道在“包裹”时将其设置为什么(假设您希望它全屏显示)。再次感谢。【参考方案2】:

latestArray 没有正确初始化。

只要您获得 EXEC_BAD_ACCESS,就通过 Zombies Instrument 运行您的代码。这将指向任何有问题的代码。

【讨论】:

【参考方案3】:

对象 latestsImg1 和 latestsLogo1 在初始化时不会被保留。因此,当 dispatch_async 中执行的异步代码块运行时,这些值可能已经被释放并且不再有效。因此,当异步块执行时,这两个指针会被遗忘。我建议要么不要通过 GrandCentral 调度执行这两个任务,要么如果您必须异步执行它们,则在创建后保留它们并在异步块中释放它们。

类似:

NSData *latestsImg1 = [NSData dataWithContentsOfURL:[NSURL URLWithString:img1]]; [latestImg1 保留]; 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];

);

【讨论】:

以上是关于在 uiviewcontroller 中添加 uitableviewcontroller 作为子视图时出错的主要内容,如果未能解决你的问题,请参考以下文章

将 UIViewController 添加到 UICollectionViewCell

UIViewController 的视图没有出现在 UIPopoverController 中

如何添加 UIViewController?

UIViewcontroller 在 uinavigationcontroller 堆栈中不可见

将 UIViewController 的 UI 扩展到子 UIViewControllers

从 swiftUI 中的一个嵌入式 UIViewController 导航到 swift UI 中的另一个嵌入式 UIViewcontroller