在 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 在 uinavigationcontroller 堆栈中不可见
将 UIViewController 的 UI 扩展到子 UIViewControllers
从 swiftUI 中的一个嵌入式 UIViewController 导航到 swift UI 中的另一个嵌入式 UIViewcontroller