目标c UITableViewCell不显示内容

时间:2016-11-08 03:31:13

标签: ios objective-c uitableview

我的tableview中的单元格无法显示任何内容。

- (void)viewDidLoad {
[super viewDidLoad];
testArray = [[NSMutableArray alloc] init];    
}

如果单击该按钮,应用程序将转到下一个屏幕并显示该表。 (日志显示testString存储在testArray中)

- (IBAction)goNext:(id)sender {

   for(int i=0; i<10; i++){           
             NSString *testString = @"Hello";
             [testArray addObject:testString];
             NSLog(@"myArray:\n%@", testArray[i]);        
         }
         UIStoryboard *mainStoryBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
         UIViewController *vc = [mainStoryBoard instantiateViewControllerWithIdentifier:@"test"];
         [self presentViewController:vc animated:YES completion:nil];

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
   return testArray.count;
}

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

static NSString *cellId = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];

cell.textLabel.text = testArray[indexPath.row];
cell.detailTextLabel.text = [NSString stringWithFormat:@"%d", (int)indexPath.row + 1];

return cell;

}

如果我这样做,将显示内容。

- (void)viewDidLoad {
[super viewDidLoad];
[self testArraySetup];    
}

- (void)testArraySetup{

testArray = [NSMutableArray arrayWithArray:@[@"Pizza",@"Bread",@"Drinks"]];

}

非常感谢任何建议。

3 个答案:

答案 0 :(得分:2)

如果要在单击Next按钮时将一个Controller A的测试数组传递给另一个UIViewController B,则应在UIViewController B中创建testArray的属性,在该属性中要显示tableView。

    // UIVIewController A
@interface ViewControllerA ()
{
   NSMutableArray * testArray;
}
    - (void)viewDidLoad {
    [super viewDidLoad];
    testArray = [[NSMutableArray alloc] init];    
    }

        - (IBAction)goNext:(id)sender {

           for(int i=0; i<10; i++){           
                     NSString *testString = @"Hello";
                     [testArray addObject:testString];
                     NSLog(@"myArray:\n%@", testArray[i]);        
                 }
                 UIStoryboard *mainStoryBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
                 ViewControllerB *vc = [mainStoryBoard instantiateViewControllerWithIdentifier:@"test"];
                 vc.testArray = testArray;
                 [self presentViewController:vc animated:YES completion:nil];

        }

    // ViewController B
    @interface ViewControllerB : UIViewController
        @property (nonatomic,retain)NSMutableArray * testArray;

无需在UIViewController B的viewDidLoad中重新初始化testArray。否则它会将内存重新分配给testArray。

答案 1 :(得分:1)

这一行...

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];

...如果重用队列中没有单元格(这是应用程序首次运行时的初始状态,而您尚未明确创建任何单元格),则不会创建单元格并返回nil。这意味着您的整个方法将返回nil(即,没有单元格)。

使用此功能时,您还需要检查cell == nil,如果是,则需要使用以下内容自行创建新单元格:

if ( ! cell )
   cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId];

或者,您可以为标识符注册一个类,然后使用[tableView dequeueReusableCellWithIdentifier: forIndexPath:]代替,这将根据您注册的类为您生成一个单元格。

有关两者之间差异的信息,请参阅:When to use dequeueReusableCellWithIdentifier vs dequeueReusableCellWithIdentifier : forIndexPath

答案 2 :(得分:1)

解决方案可能存在的问题:

1:您尚未将redeem.is_valid()的{​​{1}}和datasource正确设置为delegate

解决方案:在UITableViewself

中添加这些行
ViewDidLoad

2:您没有在故事板中为ViewDidAppear建立正确的yourTableView.datasource = self; yourTableView.delegate = self; 连接。

解决方案:创建IBOutlet现在转到故事板,在连接检查器下,您可以通过控制拖动将您的属性与storyboard中的tableView连接。

3:从您的代码中,您TableView中的@property (nonatomic, weak) IBOutlet UITableView *tableView;似乎正在使用datasourcedelegate方法,并且您正试图在TableView中显示内容{1}}。

解决方案:您应该在相应的ViewControllerA类中实现UITableView的ViewControllerBdatasource

4:您没有正确初始化/重复使用delegate

解决方案:请参阅@ 海滩之子

的答案