如何创建固定数量的UITableViewCell,如果数据为null,则不应显示行

时间:2016-07-14 06:22:21

标签: ios objective-c uitableview

我使用tableView显示一些信息,这只是四行信息。我想为每一行分配相应的信息。 就像下面图像中显示的那样,有四行,与图像中的相同,所以我使用tableView。这里我的问题是我创建了四个单元格,但不知道我应该如何在特定单元格中使用标签并显示信息。 并且如果值为null,那么该行不应该存在意味着如果四个中的两个值为null,那么tableView中只有两个具有值的行。我怎样才能做到这一点。直到现在我只能显示一行信息。

enter image description here

- (NSArray *)myTableViewCells
{
     if (!_myTableViewCells)
     {
         _myTableViewCells = @[
                              [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil],
                              [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil],
                              [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil],
                              [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil]

                              ];
       }

       return _myTableViewCells;
}

   if([managedObject valueForKey:@"personality_company_master_values"] != nil)
{
    [_displayValues addObject:[NSString stringWithFormat:@"Personality    %@",[managedObject valueForKey:@"personality_company_master_values"]]];
}
 if([managedObject valueForKey:@"video_tag"] != nil)
{
    [_displayValues addObject:[NSString stringWithFormat:@"Tag                 %@",[managedObject valueForKey:@"video_tag"]]];
}

 if([managedObject valueForKey:@"industry_master_values"] != nil)
{
    [_displayValues addObject:[NSString stringWithFormat:@"Industry       %@",[managedObject valueForKey:@"industry_master_values"]]];
}



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

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 {
  UITableViewCell* cell = self.myTableViewCells[indexPath.row];

   //   NSManagedObject *managedObject = [self.devices lastObject];

     cell.backgroundColor = [self colorFromHexString:@"#014455"];


   cell.textLabel.text = _displayValues[indexPath.row];

   cell.textLabel.backgroundColor = [self colorFromHexString:@"#014455"];

   cell.textLabel.textColor = [UIColor whiteColor];

   cell.textLabel.font=[UIFont systemFontOfSize:14.0];


   //  UILabel *lbl=(UILabel*)[cell viewWithTag:900];

   //   [lbl setText:[managedObject valueForKey:@"personality_company_master_values"]];

   //   lbl.textColor=[UIColor blackColor];

return cell;
  }

3 个答案:

答案 0 :(得分:1)

我担心你做错了几件事,从预先分配一系列细胞开始。 Tableview不能像这样工作,您可以按需提供单元格并使用数据模型中的值填充它们。如果要删除单元格更新数据模型,请调用reloadData()。这是一个简单的例子:

import UIKit

class MyCell: UITableViewCell {
    var row: Int = -1   // serves no purpose but to show how you might subclass a UITableViewCell
}

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    var dataModel = [
        "Hello", "World,", "this", "is", "a", "tableview"
    ]

    var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        var frame = view.bounds
        let statusBarHeight = UIApplication.sharedApplication().statusBarFrame.height

        frame.origin.y += statusBarHeight
        frame.size.height -= statusBarHeight

        tableView = UITableView(frame: frame, style: .Plain)
        tableView.delegate = self
        tableView.dataSource = self

        tableView.registerClass(MyCell.self, forCellReuseIdentifier: "mycell")

        view.addSubview(tableView)
    }

    // MARK: - UITableViewDataSource

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dataModel.count
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("mycell") as! MyCell
        let row = indexPath.row

        cell.row = row    // there is no point in doing this other than to show it as an example
        cell.textLabel!.text = dataModel[row]

        return cell
    }

    // MARK: - UITableViewDelegate

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        dataModel.removeAtIndex(indexPath.row)
        tableView.reloadData()
    }
}

编辑:这是一个客观的c版

////////////////////////////
///  Objective C Version  //
////////////////////////////

#import "ViewController.h"

@interface MyCell: UITableViewCell

@property(assign) NSInteger row;    // serves no purpose but to show how you might subclass a UITableViewCell

@end

@implementation MyCell @end


@interface ViewController() <UITableViewDataSource, UITableViewDelegate>

@property NSMutableArray *dataModel;
@property UITableView *tableView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    _dataModel = [NSMutableArray arrayWithArray: @[@"Hello", @"World,", @"this", @"is", @"a", @"tableview"]];

    CGRect frame = self.view.bounds;
    CGFloat statusBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height;

    frame.origin.y += statusBarHeight;
    frame.size.height -= statusBarHeight;

    _tableView = [[UITableView alloc] initWithFrame: frame style: UITableViewStylePlain];
    _tableView.delegate = self;
    _tableView.dataSource = self;

    [_tableView registerClass: [MyCell class] forCellReuseIdentifier: @"mycell"];

    [self.view addSubview: _tableView];
}

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    MyCell *cell = (MyCell *) [tableView dequeueReusableCellWithIdentifier: @"mycell"];
    NSInteger row = indexPath.row;

    cell.row = row;    // there is no point in doing this other than to show it as an example
    cell.textLabel.text = _dataModel[row];

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [_dataModel removeObjectAtIndex: indexPath.row];
    [_tableView reloadData];
}

@end

答案 1 :(得分:1)

获取要在数组中显示的值。     像这样的东西

@property (monatomic, strong)NSMuatableArray *displayValues;


-(void)viewDidLoad
{

    self.displayValues =  [[NSMutableArray alloc]init];
    NSManagedObject *managedObject = [self.devices lastObject];

    if([managedObject valueForKey:@"personality_company_master_values"] != nil)
    {
    [self.displayValues addObject:[managedObject valueForKey:@"personality_company_master_values"]];
    }
    if([managedObject valueForKey:@"company_master_values"] != nil)
    {
    [self.displayValues addObject:[managedObject valueForKey:@"company_master_values"]];
    }

    if([managedObject valueForKey:@"tag_master_values"] != nil)
    {
    [self.displayValues addObject:[managedObject valueForKey:@"tag_master_values"]];
    }
}






          - (NSArray *)myTableViewCells
                 {
                 if (!_myTableViewCells)
                 {
                     _myTableViewCells = @[
                                          [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil],
                                          [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil],
                                          [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil],
                                          [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil]

                                          ];
                   }

                    return _myTableViewCells;
                   }


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

                     - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
                 {
                UITableViewCell* cell = self.myTableViewCells[indexPath.row];
                // NSManagedObject *managedObject = [self.devices lastObject];

                //cell.textLabel.text = [NSString stringWithFormat:@"%@",[managedObject valueForKey:@"personality_company_master_values"]];
                cell.textLabel.text = self.displayValues[indexPath.row];
                   //not getting have to do this way or any other way please help  

                   // secondLabel.text = [NSString stringWithFormat:@"%@",[managedObject valueForKey:@"company_master_values"]];

                   // thirdLabel.text = [NSString stringWithFormat:@"%@",[managedObject valueForKey:@"tag_master_values"]];        

                return cell;
                }

答案 2 :(得分:0)

您不需要创建固定数量的单元格,这不是解决问题的有效方法。您应该创建NSMutableDictionary并保存这样的数据:

NSMutableArray *data = [NSMutableDictionary dictionary];
[data setValue:@"Vijayakanth" forKey:@"Personality"];

现在在表视图委托中,您可以返回noOfRowsInSection的键计数,在cellForRowAtIndexPath中,您可以从字典中获取键,获取该键的值w.r.t并将值分配给您的单元格。在你的情况下:

Key: Personality (which is shown on the left side)
Value: Vijayakanth (which is shown on the right side)

希望你明白这一点。