NSObject data to UITableViewCell - ios

I created a class with some properties. In the storyboard I have a tableview controller. I want to pass data from the class to the tableview. In each cell I have some labels. I want to fill the data but I haven't success with the arrays. Can you please help me.
So I have a City class with some properties for ex. property1, property2, which are labels
#import <Foundation/Foundation.h>
#interface DACityObject : NSObject {
NSNumber *ID;
NSString *name;
NSNumber *temperature;
NSNumber *minimumTemperature;
NSNumber *maximumTemperature;
NSString *iconName;
}
#property (strong,nonatomic) NSNumber *ID;
#property (strong,nonatomic) NSString *name;
#property (strong,nonatomic) NSNumber *temperature;
#property (strong,nonatomic) NSNumber *minimumTemperature;
#property (strong,nonatomic) NSNumber *maximumTemperature;
#property (strong,nonatomic) NSString *iconName;
#end
and .m file
#import "DACityObject.h"
#implementation DACityObject
#synthesize ID,name,temperature,minimumTemperature,maximumTemperature,iconName;
#end
DACityCell.h
#import <UIKit/UIKit.h>
#interface DACityCell : UITableViewCell
#property (strong, nonatomic) IBOutlet UILabel *name;
#property (strong, nonatomic) IBOutlet UILabel *temperature;
#property (strong, nonatomic) IBOutlet UILabel *minimumTemperature;
#property (strong, nonatomic) IBOutlet UILabel *maximumTemperature;
#property (strong, nonatomic) IBOutlet UIImageView *iconName;
#end
DACityCell.m
#import "DACityCell.h"
#implementation DACityCell
#synthesize name,temperature,minimumTemperature,maximumTemperature,iconName;
- (void)awakeFromNib {
}
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
}
return self;
}
- (void)layoutSubviews {
[super layoutSubviews];
self.imageView.frame = CGRectMake(0,45,75,75);
}
#end
How can I create a data for example 3 cities and put it in the table view in my MainController?

Let's say you've already created your 3 data via the class object DACityObject, all you have to do now is to place them in an array say dataArray (NSMutableArray) and call them in the method cellForRowAtIndexPath in your class that has the UITableView, then just call your custom tableview cell.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = #"CellIdentifier";
// extract data here
DACityObject *dataObject = [dataArray objectAtIndex:indexPath.row];
DACityCell *cell = (DACityCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil)
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:#"DACityCell" owner:self options:nil];
cell = [nib objectAtIndex:0];
}
cell.name.text = dataObject.name;
cell.temperature.text = dataObject.temperature;
.
.
.... etc.
return cell;
}

Related

Description labels disappear as I scroll on my UITableViewController

THE CODE:
ViewController.m
#interface ViewController ()
#property (strong,nonatomic) NSMutableArray<NSString *> *sections;
#property (strong,nonatomic) NSMutableArray<NSMutableArray<TableItem *> *> *items;
#property (strong,nonatomic) NSMutableArray<TableItem *> *sectionItems;
#end
...
- (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView {
return _items.count;
}
- (NSString *) tableView: (UITableView *) tableView titleForHeaderInSection:(NSInteger) section {
NSLog(_sections[section]);
return _sections[section];
}
-(NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection:(NSInteger)section {
return _items[section].count;
}
- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:#"Cell" forIndexPath:indexPath ];
TableItem *item = _items[indexPath.section][indexPath.row];
cell.textLabel.text = item.title;
cell.detailTextLabel.text = item.theDescription;
return cell;
}
All appears as it should. When I scroll down and back up, the description labels have disappeared.
Some context:
TableItem.h
#interface TableItem : NSObject
#property (weak,nonatomic) NSString *title;
#property (weak,nonatomic) NSString *theDescription;
-(instancetype) initWithTitle: (NSString *) title theDescription: (NSString *) theDescription;
#end
It seems to be a problem with dequeueReusableCell. I know this has been asked before, but I checked all I could find and found no answer to my issue.
Possibly, the problem lies in TableItem properties. They are weak, which means actual strings can be freed and nilled at any moment.
So, by the time you scroll up and down, title and theDescription are already nils.
Change your TableItem class:
#property (strong, nonatomic) NSString *title;
#property (strong, nonatomic) NSString *theDescription;
Or, if you want to be sure that after assigning new value to its properties, these values can't be modified, use copy:
#property (copy, nonatomic) NSString *title;
#property (copy, nonatomic) NSString *theDescription;

uitableview array of objects as datasource

i have a UITableView in a storyboard in an ios xcode project,
i also have an array of menuitem objects stored in itemarray:
NSMutableArray *itemarray;
this is my menuitem.h file
#import <Foundation/Foundation.h>
#interface menuitem : NSObject
#property (nonatomic) NSString *itemtitle;
#property (nonatomic) NSString *itemdesc;
#property (nonatomic) int itemid;
#property (nonatomic) int itemprice;
#property (nonatomic) NSString *itemcat;
#end
this is my tableviewcell.m file:
#import "tableviewcell.h"
#import "menuitem.h"
#interface tableviewcell ()
#property (nonatomic, weak) IBOutlet UILabel *titleLabel;
#property (nonatomic, weak) IBOutlet UILabel *descLabel;
#property (nonatomic, weak) IBOutlet UILabel *priceLabel;
#end
#implementation tableviewcell
-(void)configureWithmenuitem:(menuitem *)item{
NSLog(#"hello");
self.titleLabel.text = item.itemtitle;
self.descLabel.text = item.itemdesc;
self.priceLabel.text = [NSString stringWithFormat:#"%.1d", item.itemprice];
}
#end
i want to get the itemtitle, itemdesc and itemprice from each instance of menuitem into 3 labels on each of the tableviewcells
Your tableviewcell is a View and thus it should only know how to display itself and not what to display. It's the job of your controller (through the delegate tableView:cellForRowAtIndexPath: method) to tell the view what to display.
Thus you should do something like:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:#"Id"];
//Assuming you've stored your items in an array.
Item *item = [items objectAtIndex:indexPath.row];
cell.titleLabel.text = item.itemTitle;
cell.descLabel.text = item.itemdesc;
cell.priceLabel.text = [NSString stringWithFormat:#"%.1d", item.itemprice];
return cell;
}
^ The above code assumes you have a prototype cell. If you don't, you'll have to alloc if cell is nil after dequeue.

IOS: Not able to access my label in UICell

I am trying to create a table with prototype cell
for that i had taken a tableview and inserted a cell in table view
and in cell i had taken a label in which i want to set values from my Employee class.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
RWTCell *cell = (RWTCell*)[tableView dequeueReusableCellWithIdentifier:#"employeeeCell"];
if (!cell){
cell = [[RWTCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:#"employeeeCell"];
}
Employee *currentEmp=[employeeArray objectAtIndex:indexPath.row];
NSLog(#" %#",currentEmp.empName);
cell.lName.text=currentEmp.empName;
// cell.textLabel.text = currentEmp.empName;
return cell;
}
Above is my code
when i try to do
RWTCell *cell = (RWTCell*)[tableView dequeueReusableCellWithIdentifier:#"employeeeCell"];
it always gives me null, and this line below never works
cell.lName.text=currentEmp.empName;
my Employee.m class
#import "Employee.h"
#implementation Employee
#synthesize empDepart,empDoj,empDob,empName,empSalary,empGender;
#end
and Employee.h
#import <Foundation/Foundation.h>
#interface Employee : NSObject
#property (nonatomic, retain) NSString *empName;
#property (nonatomic, retain) NSString *empSalary;
#property (nonatomic, retain) NSString *empDob;
#property (nonatomic, retain) NSString *empDoj;
#property (nonatomic, retain) NSString *empGender;
#property (nonatomic, retain) NSString *empDepart;
#end
EDIT
sorry i forgot to mention my cell class
and i am working on storyboard
#import "RWTCell.h"
#implementation RWTCell
#synthesize lName;
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code
}
return self;
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
// Configure the view for the selected state
}
#end
#import <UIKit/UIKit.h>
#interface RWTCell : UITableViewCell
#property (strong, nonatomic) IBOutlet UILabel *lName;
#end
Take a look at the custom cell I am using in my application.
.h file of custom cell
#import <UIKit/UIKit.h>
#interface EvalHistoryCell : UITableViewCell
#property (strong, nonatomic) IBOutlet UILabel *lblEvaluator;
#property (strong, nonatomic) IBOutlet UILabel *lblDate;
#property (strong, nonatomic) IBOutlet UILabel *lblStore;
#property (strong, nonatomic) IBOutlet UILabel *lblStatus;
#end
.m file of custom cell
#import "EvalHistoryCell.h"
#implementation EvalHistoryCell
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code
}
return self;
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
// Configure the view for the selected state
}
#end
in main viewcontroller where you want to use it:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *strEvalIdentifier = #"HistoryIdentifier";
EvaluationListEntity *objEvalEntity=[arrmEvalList objectAtIndex:indexPath.row];
EvalHistoryCell *cell = (EvalHistoryCell *)[tableView dequeueReusableCellWithIdentifier:strEvalIdentifier];
if (cell == nil)
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:#"EvalHistoryCell" owner:self options:nil];
cell = [nib objectAtIndex:0];
}
cell.lblEvaluator.text=objEvalEntity.strEvaluatorName;
return cell;
}
Try this.
Make sure you connected your custom cell with your view at RWTCell.xib
At your .h file
#property(nonatomic,strong) RWTCell *rwtcell;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *MyIdentifier= #"MyIdentifier";
RWTCell *cell = (RWTCell*)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if(cell==nil)
{
[[NSBundle mainBundle] loadNibNamed:#"RWTCell" owner:self options:nil];
cell=self.rwtcell;
}
Employee *currentEmp=[employeeArray objectAtIndex:indexPath.row];
NSLog(#" %#",currentEmp.empName);
cell.lName.text=currentEmp.empName;
return cell;
}
Hope it helps you..

Can't access the IBOutlets of my custom cell on cellForRowAtIndexPath

I made a custom cell with a XIB:
.h
#import <UIKit/UIKit.h>
#interface TWCustomCell : UITableViewCell {
IBOutlet UILabel *nick;
IBOutlet UITextView *tweetText;
}
#end
.m
#import "TWCustomCell.h"
#implementation TWCustomCell
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code
}
return self;
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
// Configure the view for the selected state
}
#end
And I load them in cellForRowAtIndexPath: in this way:
- (UITableViewCell *)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = #"Cell";
TWCustomCell *cell = (TWCustomCell*)[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
//UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
NSArray *topLevelObject = [[NSBundle mainBundle] loadNibNamed:#"TWCustomCell" owner:nil options:nil];
for (id currentObject in topLevelObject) {
if([currentObject isKindOfClass:[UITableViewCell class]]) {
cell = (TWCustomCell*) currentObject;
break;
}
}
}
// Configure the cell...
cell.tweetText.text = [tweets objectAtIndex:indexPath.row];
return cell;
}
On cell.tweetText.text = [tweets objectAtIndex:indexPath.row];
On the dot after cell, Xcode tells me_ "Property 'tweetText' not found on object of type 'TWCustomCell *'; did you mean to access ivar 'tweetText'?" and tells me to replace it with
cell->tweetText.text. But there appears the error: "Semantic Issue: Instance variable 'tweetText' is protected". What do I have to do?
You didn't declare a property that will allow access to the IBOutlets outside of the class with the dot syntax.
Here's how i would do it:
in your .h file:
#property (nonatomic, readonly) UILabel *nick;
#property (nonatomic, readonly) UITextView *tweetText;
in the .m:
#synthesize nick, tweetText;
Or you could remove the ivar IBOutlets and declare the properties as retain and IBOutlets like this:
#property (nonatomic, retain) IBOutlet UILabel *nick;
#property (nonatomic, retain) IBOutlet UITextView *tweetText;
The problem was with my custom cell ivars:
#import <UIKit/UIKit.h>
#interface TWCustomCell : UITableViewCell {
//added here #public and you can access them now
#public
IBOutlet UILabel *nick;
IBOutlet UITextView *tweetText;
}
#end

Custom UITableViewCell doesn't appear in the table

I have created a UITableViewCell and I am trying to display it in one of my table, but for some reason it doesn't come, the table is coming empty. And when I click on the one of cell in the table it takes me down to next level, which means the custom UITableViewCell is not getting rendered properly.
Here is my custom UITableViewCell .h file
#interface ProductViewCell : UITableViewCell {
IBOutlet UILabel *titleLabel;
IBOutlet UILabel *detailLabel;
IBOutlet UIImageView *imageView;
}
#property (nonatomic, retain) UILabel *titleLabel;
#property (nonatomic, retain) UILabel *detailLabel;
#property (nonatomic, retain) UIImageView *imageView;
Here is the .m file
#import "ProductViewCell.h"
#implementation ProductViewCell
#synthesize titleLabel, detailLabel, imageView;
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
}
#end
Here is the .h file which subclasses UITableViewController
#interface ProductCategoryViewController : UITableViewController {
NSArray *tableDataSource;
}
#property (nonatomic, retain) NSArray *tableDataSource;
Here is the .m file for ProductCategoryViewController
#implementation ProductCategoryViewController
#synthesize tableDataSource;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:
(NSIndexPath *)indexPath {
static NSString *CellIdentifier = #"Cell";
ProductViewCell *cell = (ProductViewCell*)[tableView
dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[ProductViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier] autorelease];
}
NSDictionary *dictionary = [self.tableDataSource objectAtIndex:indexPath.row];
cell.titleLabel.text = [dictionary objectForKey:#"name"];
cell.imageView.image = [UIImage imageNamed:[dictionary objectForKey:#"imageUrl"]];
return cell;
}
Your help is appreciated.
Thanks,
Yogesh
I got this working by making some changes, in my tableviewcontroller I added an IBOutlet for ProductViewCell and synthesis the same.
Then I changed the xib file for ProductViewCell
1) I make File's Owner to my tableViewController
2) Then here I linked the the IBOutlet that I created in the tableViewContoller to the ProductViewCell.
I am not sure if this is the right way to do it but atleast this is working for me now

Resources