【问题标题】:UITableViewController not showing up cells when re-visit重新访问时 UITableViewController 不显示单元格
【发布时间】:2016-03-25 19:19:44
【问题描述】:

我在界面生成器中通过 segue 连接了一个主相机视图(相机)和一个表视图(照片列表)。 对于表格视图,我决定自己构建它(UIViewController 内部带有 TableView,单元格是从具有自己的类的 XIB 加载的)

当我运行应用程序并从相机视图移动到表格视图时,一切正常,显示单元格背景颜色,列表也可以毫无问题地滚动。 (重复使用单元格没有问题)

然后我解开继续回到相机视图并再次返回表格视图,单元格的数量是正确的,但都是空单元格。

每个单元格都有 NSLog,框架已更改,autoSize 消失了。为什么会这样?展开 segue 时是否需要进行一些清理,以便下次它像第一次一样从头开始启动 UIViewController?

任何提示将不胜感激。 谢谢 !

// FIRST TIME TO TABLE VIEW
<galleryCell: 0x17516300; baseClass = UITableViewCell; frame = (0 0; 480 77); autoresize = RM+BM; layer = <CALayer: 0x175166a0>>

// SECOND TIME TO TABLE VIEW 
<galleryCell: 0x175a4910; baseClass = UITableViewCell; frame = (0 0; 320 44); layer = <CALayer: 0x17513d10>>

[更新]源代码

// TableController.h
#import <UIKit/UIKit.h>
@interface TableController : UIViewController <UITableViewDelegate,UITableViewDataSource>
@property (nonatomic,weak) IBOutlet UITableView *tv;
@property (nonatomic,strong)  NSArray *data;
@end

[更新完整的 .m 文件]

//
//  TableController.m
//  blurCam
//
//  Created by KDS on 3/25/16.
//  Copyright (c) 2016 KDS. All rights reserved.
//

#import "TableController.h"
#import "galleryCell.h"
#import "UIButtonExt.h"

BOOL nibRegistered=NO;

@implementation TableController

+(UIBarButtonItem*) backButton: (id)target selector:(SEL)selector{

    UIViewController* controller=(UIViewController*)target;
    [controller.navigationController setNavigationBarHidden:NO];

    UIImage* backImg = [UIImage imageNamed:@"detail_back.png"];
    UIButtonExt* backBtn = [UIButtonExt buttonWithType:UIButtonTypeCustom];
    [backBtn setFrame:CGRectMake(0, 0, backImg.size.width/3.0 , backImg.size.height/3.0)];
    [backBtn setImage:backImg forState:UIControlStateNormal];
    [backBtn addTarget:target action:selector forControlEvents:UIControlEventTouchUpInside];

    return [[UIBarButtonItem alloc] initWithCustomView:backBtn];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    [[self navigationController] setNavigationBarHidden:NO animated:YES];
    self.navigationItem.leftBarButtonItem=[TableController backButton:self selector:@selector(back)];

    // get document folder file list
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    _data=[self listFileAtPath:documentsDirectory];

    [self.tv reloadData];
}

-(void) viewWillAppear:(BOOL)animated {
    [_tv reloadData];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(NSArray *)listFileAtPath:(NSString *)path
{
    //-----> LIST ALL FILES <-----//
    NSLog(@"LISTING ALL FILES FOUND");

    int count;
    NSArray *directoryContent = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:NULL];
    return directoryContent;
}

// LAYER TABLE !
//
#pragma mark-
#pragma mark Table view data source method


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

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    // set a tag
    static NSString *iden=@"galleryCell";

    // use nib as cell design

    if(nibRegistered==NO) {
        UINib *nib=[UINib nibWithNibName:@"galleryCell" bundle:nil];
        [tableView registerNib:nib forCellReuseIdentifier:iden];
        nibRegistered=YES;
    }

    // ask for reuse ?
    galleryCell *cell=(galleryCell*)[tableView dequeueReusableCellWithIdentifier:iden];
    if(cell == nil){
        NSLog(@"NILLLLLL");
        cell = [[galleryCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:iden];
    }

    cell.btn1.hidden=NO;

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *imgPath = [documentsDirectory stringByAppendingPathComponent:[_data objectAtIndex:0]];
    NSData *imgData = [[NSData alloc] initWithContentsOfURL:[NSURL fileURLWithPath:imgPath]];

    UIImage *img=[UIImage imageWithData:imgData];
    NSLog(@"image to load %@",imgPath);

    [cell.btn1 setImage:img forState:UIControlStateNormal];

    NSLog(@"~~~%@",cell);
    NSLog(@"~~~hidden %d",cell.hidden);


    return cell;

}

-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
       return 77;
}

//
//
//
//

- (BOOL)prefersStatusBarHidden { return YES; }

//

-(void) back {
    [self performSegueWithIdentifier: @"cameraSegue" sender: self];
}


@end

这是 TableController 的出口连接

和galleryCell.XIB的出口连接

【问题讨论】:

  • 您在任何时候都在调用 tableview reloadData 吗?是在 viewDidLoad: 还是 viewWillAppear: 中?
  • 显示您的代码。表视图数据源的实现和视图控制器的方法相关视图。
  • @RomyIlano 是的,在 viewWillAppear 内:-谢谢!
  • @AdeelMiraj 添加了上面表格部分的代码 - 谢谢!
  • 这段代码看起来很好。您是否在代码中的其他地方对电视插座进行了处理?如果可能,请添加您的完整 .m 文件和准备转场方法。

标签: ios objective-c uitableview unwind-segue


【解决方案1】:

好的,这是有效的 此行不会加载 XIB

cell = [[galleryCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:iden];

替换.m文件中的这行代码

cell = [[[NSBundle mainBundle] loadNibNamed:@"galleryCell" owner:self options:nil] objectAtIndex:0]; 

然后它运行没有问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    相关资源
    最近更新 更多