gpt4 book ai didi

ios - 在iOS 7中点击UITableView时,所有UITableCells都消失

转载 作者:技术小花猫 更新时间:2023-10-29 11:19:20 26 4
gpt4 key购买 nike

我在iOS7中的UITableView遇到问题。最初,数据加载正常,然后在控制台中获得输出,证明单元格正在正确地与数据源对话,即,但是一旦我点击表上的任意位置,单元格就会消失并且表变为空白 。空UITableView中的单元格高度似乎符合我自定义的原型(prototype)单元格的高度(410px),但是单元格中的所有数据均消失了,并且空表 View 的行为就像它只有一个单元格一样(如其默认值)状态,然后再连接到委托(delegate))。

我正在为此应用使用 Storyboard。

为了获得一些背景信息,该应用程序类似于iphone Instagram应用程序,我正在使用该应用程序作为学习iOS 7开发的方式。我一直在努力解决这个问题,但我找不到任何可以帮助我解决此问题的在线资源,所以我想问一下Stack Overflow上的所有聪明人。

我准备了一张可以帮助您解决问题的图形

higher resolution version here

这是我的TableViewController代码:

@interface PA_PhotoTableViewController ()

@property (nonatomic, copy) NSArray *photos;

@end



@implementation PA_PhotoTableViewController


- (void)viewDidLoad {
[super viewDidLoad];
self.photos = [[PA_PhotoStore sharedPhotoStore] allPhotos];
}


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


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [[[PA_PhotoStore sharedPhotoStore] allPhotos] count];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
PA_PhotoCell *cell = [tableView dequeueReusableCellWithIdentifier:@"PhotoCell" forIndexPath:indexPath];


PA_Photo *photo = (self.photos)[indexPath.row];

cell.photoTitle.text = photo.title;
cell.photoOwnerName.text = [NSString stringWithFormat:@"%@", photo.owner];
cell.photoLikes.text = @"99";

// Photo Image URL
NSURL *photoImageURL = [NSURL URLWithString:photo.image_full_url];
[cell.photoImage sd_setImageWithURL:photoImageURL placeholderImage:[UIImage imageNamed:@"lightGraySpinningLoader.gif"]];

// Photo Owner Image
[cell.photoOwnerImage sd_setImageWithURL:photoImageURL placeholderImage:[UIImage imageNamed:@"lightGraySpinningLoader.gif"]];


return cell;
}

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

// This code never gets called when I try to tap on a cell
NSLog(@"A row was selected");
}


- (void)dealloc {
NSLog(@"dealloc called in PA_PhotoTableViewController");
}

这是自定义单元格代码PA_PhotoCell(合并的.h和.m文件):
@interface PA_PhotoCell : UITableViewCell

@property (nonatomic, weak) IBOutlet UIImageView *photoImage;
@property (nonatomic, weak) IBOutlet UILabel *photoTitle;
@property (nonatomic, weak) IBOutlet UILabel *photoOwnerName;
@property (nonatomic, weak) IBOutlet UIImageView *photoOwnerImage;
@property (nonatomic, weak) IBOutlet UILabel *photoLikes;
@property (nonatomic, weak) IBOutlet UILabel *photoTimestamp;
@property (nonatomic, weak) IBOutlet UILabel *photoComments;

@end



@implementation PA_PhotoCell

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
NSLog(@"in set selected");
}


-(void)setHighlighted:(BOOL)highlighted {
NSLog(@"in set highlighted");
}

您可以看到一些 NSLog()调用,以帮助我查看是否有任何调用。

我要去哪里错了?最终目标是单击TableViewCell实例之一并启动UINavigationController,我知道该怎么做,但是直到我弄清楚为什么UITableView不会滚动以及为什么消失后,我才能继续执行该步骤。当我点击它!

编辑:经过大量的测试,调试和实验,我已经可以得出结论,实际上UITableView根本没有问题,实际上,UITableView如何被加载到其父 View 中是一个问题。 。我仍然没有找到解决问题的方法,但是我越来越接近找到原因了。这是我发现的:

首先,当点击屏幕底部的任何UIButton时(参见照片引用),它将UIViewController的相关实例加载到名为placeholderView的UIView中。当我在该UIView的外部运行有问题的UITableView时(该UITableViewController自行运行,未嵌入另一个UIView中),该表可以正常工作,滚动,恢复点击事件,依此类推。因此,一旦我将UITableView加载到UIView中,UITableView就会变得无响应(它不会滚动或接收点击事件),并且尝试与之交互,UITableView就会完全空白。我的调试 session 得出的结论是,NSArray * photos永远不会重置为nil,或者无论如何都无法对其进行操作,因此表只是空白。

那么,对于将UITableView加载到通用UIView后会导致UITableView执行此操作的人,是否有任何想法?加载到该通用UIView中的所有其他 View 都是响应性的,并且行为符合预期。它只是这个UITableView给我的问题。

如果您查看我所附的图形(上),您将看到我正在使用似乎是UITabBarView的图形,但实际上,它只是一个内部带有UIButtons的通用 View 。我之所以决定制作自己的“UITabBarView外观”而不是使用现成的UITAbBarView类,是因为我想为左下角的“菜单”按钮提供自定义功能(我希望将一个不错的UIView滑入从左侧开始,并在点击“菜单”按钮时从屏幕右侧停止约60像素,而且我不知道如何自定义UITabBarView的行为,因此我选择了这种方法。

这是实际上将UITableViewController加载到 subview 中的代码(通过CustomStoryboardSegway):
// PA_HomeViewCustomStoryboardSegue.m

#import "PA_HomeViewCustomStoryboardSegue.h"
#import "PA_HomeViewController.h"

@implementation PA_HomeViewCustomStoryboardSegue

// to create a custom segue, you have to override the perform method
-(void)perform {

// get the source and destination view controllers
PA_HomeViewController *segueSourceController = (PA_HomeViewController *)[self sourceViewController];
UIViewController *destinationController = (UIViewController *)[self destinationViewController];

for (UIView *view in segueSourceController.placeholderView.subviews){
[view removeFromSuperview];
}

segueSourceController.currentViewController = destinationController;
[segueSourceController.placeholderView addSubview:destinationController.view];

}

@end

这是我的PA_HomeViewController的头文件(该 View 包含“placeholderView”,该目标 View 是在用户点击 View 底部的UIButton(类似于TabBarView)之后加载各种UIViewController的目标 View :
@interface PA_HomeViewController : UIViewController

@property (weak, nonatomic) IBOutlet UIView *placeholderView;
@property (weak, nonatomic) UIViewController *currentViewController;

@end

我希望在将UITableView加载到placeholderView的过程中遗漏一些明显的东西,并且其中的某些东西导致UITableView完全空白。

最佳答案

在其他 View 中显示UITableView时,必须始终确保“托管” UITableView的 View Controller 对其 Controller 具有强大的引用。在您的情况下,在将UITableView添加为 subview 之后,似乎已释放了UITableView的数据源。

将currentViewController属性从weak更改为strong应该可以解决您的问题。

关于ios - 在iOS 7中点击UITableView时,所有UITableCells都消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25560327/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com