Reputation: 8348
I am working on an where I have a uitableview and I want to add a uitextfield in each of its cell so that it can be used as form. There can be around 15 such uitextfields. But as I have little space on screen only 5 rows are displayed at a time and others appear on scrolling.
When I try to get the data from all of these uitextfields I only get it for those who are visible and for others I get null. It should as I am not using reuse identifier.
Following is my code for CellfoRrowAtIndex:
editContactCell *tcell = (editContactCell*) [tableView dequeueReusableCellWithIdentifier:nil];
NSArray *nib= [[NSBundle mainBundle] loadNibNamed:@"editContactCell" owner:self options:nil];
tcell = (editContactCell *)[nib objectAtIndex:0];
tcell.accessoryType = UITableViewCellAccessoryNone;
tcell.selectionStyle = UITableViewCellSelectionStyleNone;
tcell.txtDetails.tag = indexPath.row+50;
if([dictClientDetails count]>0){
if(indexPath.section==0 && indexPath.row==0){
tcell.lblTitle.text = @"Mobile:";
tcell.txtDetails.placeholder = @"Mobile:";
if([dictClientDetails count]>0){
tcell.txtDetails.text = [dictClientDetails objectForKey:@"Mobile"];
}
}
else if(indexPath.section==0 && indexPath.row==1){
tcell.lblTitle.text = @"Work:";
tcell.txtDetails.placeholder = @"Work:";
if([dictClientDetails count]>0){
tcell.txtDetails.text = [dictClientDetails objectForKey:@"Work_number"];
}
}
else if(indexPath.section==1 && indexPath.row==0){
tcell.lblTitle.text = @"Email:";
tcell.txtDetails.placeholder = @"Email:";
if([dictClientDetails count]>0){
tcell.txtDetails.text = [dictClientDetails objectForKey:@"Email"];
}
}
else if(indexPath.section==2 && indexPath.row==0){
tcell.lblTitle.text = @"IM1:";
tcell.txtDetails.placeholder = @"IM1:";
if([dictClientDetails count]>0){
tcell.txtDetails.text = [dictClientDetails objectForKey:@"IM1"];
}
}
else if(indexPath.section==2 && indexPath.row==1){
tcell.lblTitle.text = @"IM2:";
tcell.txtDetails.placeholder = @"IM2:";
if([dictClientDetails count]>0){
tcell.txtDetails.text = [dictClientDetails objectForKey:@"IM2"];
}
}
else if(indexPath.section==3 && indexPath.row==0){
tcell.lblTitle.text = @"Based In:";
tcell.txtDetails.placeholder = @"Based In:";
if([dictClientDetails count]>0){
tcell.txtDetails.text = [dictClientDetails objectForKey:@"Location"];
}
}
else if(indexPath.section==3 && indexPath.row==1){
tcell.lblTitle.text = @"Address:";
tcell.txtDetails.placeholder = @"Address:";
if([dictClientDetails count]>0){
tcell.txtDetails.text = [dictClientDetails objectForKey:@"Address"];
}
}
else if(indexPath.section==4 && indexPath.row==0){
tcell.lblTitle.text = @"Division:";
tcell.txtDetails.placeholder = @"Division:";
if([dictClientDetails count]>0){
tcell.txtDetails.text = [dictClientDetails objectForKey:@"Division"];
}
}
else if(indexPath.section==4 && indexPath.row==1){
tcell.lblTitle.text = @"Department:";
tcell.txtDetails.placeholder = @"Department:";
if([dictClientDetails count]>0){
tcell.txtDetails.text = [dictClientDetails objectForKey:@"Department"];
}
}
}
return tcell;
I am trying to get the data as following:
NSLog(@"1 %@",((editContactCell*)[tblvwEditContactDetails cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]).txtDetails.text);
NSLog(@"2 %@",((editContactCell*)[tblvwEditContactDetails cellForRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:0]]).txtDetails.text);
NSLog(@"3 %@",((editContactCell*)[tblvwEditContactDetails cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:1]]).txtDetails.text);
NSLog(@"4 %@",((editContactCell*)[tblvwEditContactDetails cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:2]]).txtDetails.text);
NSLog(@"5 %@",((editContactCell*)[tblvwEditContactDetails cellForRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:2]]).txtDetails.text);
NSLog(@"6 %@",((editContactCell*)[tblvwEditContactDetails cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:3]]).txtDetails.text);
NSLog(@"7 %@",((editContactCell*)[tblvwEditContactDetails cellForRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:3]]).txtDetails.text);
NSLog(@"8 %@",((editContactCell*)[tblvwEditContactDetails cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:4]]).txtDetails.text);
NSLog(@"9 %@",((editContactCell*)[tblvwEditContactDetails cellForRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:4]]).txtDetails.text);
But only rows which are visible are having any textfields others are returning null.
Upvotes: 2
Views: 547
Reputation: 2411
You should also check out data entry frameworks such as the free Sensible TableView framework. The framework will automatically generate all your cells from your data objects and will handle all data read/write from and to the cells. Saves me tons of time in my projects.
Upvotes: 0
Reputation: 1791
you can implement in your custom cell a protocol and pass every change to your tableview and handle this manually:
// Cell.h
@protocol UpdateValueProtocol <NSObject>
-(void)updateValue:(id)value forKey:(NSString *)key;
@end
@interface Cell : UITableViewCell <UITextFieldDelegate>
...
@property (nonatomic, assign) UITableViewController<UpdateValueProtocol> *parent;
@end
// Cell.m
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
[parent updateValue:textField.text forKey:lblTitle.text];
return YES;
}
// ParentTableView.h
@interface ParentTableView<UpdateValueProtocol>
{
NSMutableDictionary *contactDictionary;
}
// ParentTableView.m
-(void)updateValue:(id)value forKey:(NSString *)key
{
if(!contactDictionary)
contactDictionary = [NSMutableDictionary dictionary];
[contactDictionary setObject:value forKey:key];
}
don't know what your dictClientDetails
is for, but you also can use this instead of contactDictionary
to update values.
Upvotes: 2