2016-06-21 47 views
0

有兩個textFields的單元格...然後點擊ADD按鈕,我想在tableview中動態添加該單元格。並且還刪除行。 而在兩個文本框不應該得到滾動過程中,並增加新的細胞變化的文字...如何在uitableviewcontroller中動態添加單元格?

而在我想解釋的陣列中的所有文本字段值結束..

下面的代碼中,我曾嘗試

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 

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

-(void) setEditing:(BOOL)editing animated:(BOOL)animated { 
    [super setEditing:editing animated:animated]; 
    [self.tableView setEditing:editing animated:animated]; 
} 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    AddItemTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"addItemCellIdentifier"]; 
    if (cell == nil) { 
     cell = [[AddItemTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"addItemCellIdentifier"]; 
    } 
    return cell; 
} 
-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { 
    return YES; 
} 
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (editingStyle == UITableViewCellEditingStyleDelete) { 

     [itemsArray removeObjectAtIndex:indexPath.row]; 
     [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 

- (IBAction)addItemBtnClick:(id)sender { 


    if ([itemsArray count]) { 
     [itemsArray removeLastObject]; 
     NSIndexPath *index = [NSIndexPath indexPathForRow:0 inSection:0]; 
     AddItemTableViewCell *Cell = (AddItemTableViewCell *)[self.tableView cellForRowAtIndexPath:index]; 
     UITextField * name = (UITextField *)[Cell.contentView viewWithTag:11]; 
     UITextField * Qty = (UITextField *)[Cell.contentView viewWithTag:12]; 
     NSMutableDictionary *item = [NSMutableDictionary new]; 
     [item setObject:name.text forKey:@"item"]; 
     [item setObject:Qty.text forKey:@"quantity"]; 
     [itemsArray addObject:item]; 
    } 
    [itemsArray addObject:@{@"item":@"",@"quantity":@""}]; 
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
    [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 
} 
+0

可能是這個幫助你http://stackoverflow.com/questions/31870206/how-to-insert-new-cell-into-uitableview-in-swift/31870301#31870301 –

+0

我已經實現了這個...但隨着單元格數量的增加,新的單元格textfields默認取消了單元格的值... –

+0

@AkshayAmbekar數組是否已初始化? itemsArray ='[[[NSMutableArray alloc] init];' – pnizzle

回答

2

您的單元格將顯示重複的文本字段值,因爲您正在重新使用它們,而不是調整單元格細節,現在希望單元格代表不同的對象。

如果你不想要這種行爲(你顯然不需要),那麼你需要在你的dataSource上設置單元格的細節。然後在cellForRowAtIndexPath()中,用相應的對象細節填充當前單元格。或者,我不建議,您可以爲每個添加的項目在cellForRowAtIndexPath()中爲init分配一個新的單元格。當屏幕上不可見的單元格時,這會不必要地佔用更多內存。

這裏是一個例子:這是寫得很快,只演示動態填充數據源中的單元格,其他所有內容都不是建議。

#import "PeopleTableViewController.h" 

//--- Person Class 
@interface Person : NSObject<UITextFieldDelegate> 
@property (nonatomic, strong) NSString *name; 
@property (nonatomic, strong) NSString *surname; 
@end 
@implementation Person 
@end 
//--- 

#define CELL_HEIGHT 80.0f 
#define TEXTFIELD_HEIGHT 30.0f 
#define TEXTFIELD_WIDTH 120.0f 
#define TEXT_FIELD_VERTICAL_MARGIN (CELL_HEIGHT - (TEXTFIELD_HEIGHT*2))/3 
#define TEXT_FIELD_LEFT_MARGIN 20.0f 
//--- Person Cell 
@class PersonCell; 
@protocol PersonCellTextFieldProtocol <NSObject> 
-(void)personCell: (PersonCell*)cell nameTextfieldDidChange: (NSString*)newText; 
-(void)personCell: (PersonCell*)cell surnameTextfieldDidChange: (NSString*)newText; 
@end 
@interface PersonCell : UITableViewCell<UITextFieldDelegate> 
@property (nonatomic, strong) UITextField *nameTextField; 
@property (nonatomic, strong) UITextField *surnameTextField; 
@property (nonatomic, strong) UILabel *positionLabel; 
@property (nonatomic, assign) id<PersonCellTextFieldProtocol> delegate; 
@end 
@implementation PersonCell 
-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if(self) 
     [self setupSubviews]; 
    return self; 
} 
-(void)setupSubviews 
{ 
    NSUInteger nameTextFieldYPosition = TEXT_FIELD_VERTICAL_MARGIN; 

    self.nameTextField = [[UITextField alloc] initWithFrame: CGRectMake(TEXT_FIELD_LEFT_MARGIN, nameTextFieldYPosition, TEXTFIELD_WIDTH, TEXTFIELD_HEIGHT)]; 
    self.nameTextField.borderStyle = UITextBorderStyleRoundedRect; 
    self.nameTextField.placeholder = @"Name"; 
    self.nameTextField.delegate = self; 
    [self.nameTextField addTarget:self action:@selector(nameTextFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; 
    [self.contentView addSubview: self.nameTextField]; 

    self.surnameTextField = [[UITextField alloc] initWithFrame: CGRectMake(TEXT_FIELD_LEFT_MARGIN, CGRectGetMaxY(self.nameTextField.frame) + TEXT_FIELD_VERTICAL_MARGIN, TEXTFIELD_WIDTH, TEXTFIELD_HEIGHT)]; 
    self.surnameTextField.borderStyle = UITextBorderStyleRoundedRect; 
    self.surnameTextField.placeholder = @"Surname"; 
    self.surnameTextField.delegate = self; 
    [self.surnameTextField addTarget:self action:@selector(surnameTextFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; 
    [self.contentView addSubview: self.surnameTextField]; 

    self.positionLabel = [[UILabel alloc] initWithFrame: CGRectMake(5, 0, 10, 20)]; 
    self.positionLabel.font = [UIFont systemFontOfSize: 10]; 
    [self.contentView addSubview: self.positionLabel]; 
    self.positionLabel.center = CGPointMake(self.positionLabel.center.x, self.contentView.center.y); 
} 

-(void)layoutSubviews 
{ 
    self.positionLabel.center = CGPointMake(self.positionLabel.center.x, self.contentView.center.y); 
} 

-(void)nameTextFieldDidChange:(UITextField*)textField 
{ 
    if([self.delegate respondsToSelector: @selector(personCell:nameTextfieldDidChange:)]) 
     [self.delegate personCell:self nameTextfieldDidChange:textField.text]; 
} 

-(void)surnameTextFieldDidChange:(UITextField*)textField 
{ 
    if([self.delegate respondsToSelector: @selector(personCell:surnameTextfieldDidChange:)]) 
     [self.delegate personCell:self surnameTextfieldDidChange:textField.text]; 
} 

-(BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    [textField resignFirstResponder]; 
    return YES; 
} 
@end 
//--- 

@interface PeopleTableViewController()<PersonCellTextFieldProtocol> 
@end 

@implementation PeopleTableViewController 
{ 
    NSMutableArray *_peopleArray; 
} 

-(void)viewDidLoad 
{ 
    _peopleArray = [[NSMutableArray alloc] init]; 
    [self.tableView reloadData]; 
} 

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    PersonCell *cell = nil; 
    cell = [tableView dequeueReusableCellWithIdentifier: @"CellWithNameAndSurname"]; 
    if(!cell) 
    { 
     cell = [[PersonCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellWithNameAndSurname"]; 
     cell.contentView.backgroundColor = [[UIColor blueColor] colorWithAlphaComponent: 0.08f]; 
     cell.delegate = self; 
    } 

    //this should be outside the above if statement! 
    Person *respectivePerson = _peopleArray[indexPath.row]; 
    cell.nameTextField.text = respectivePerson.name; 
    cell.surnameTextField.text = respectivePerson.surname; 
    cell.positionLabel.text = [NSString stringWithFormat:@"%i", (int)indexPath.row]; 

    return cell; 
} 

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

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

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

-(void)personCell:(PersonCell *)cell nameTextfieldDidChange:(NSString *)newText 
{ 
    Person *respectivePerson = _peopleArray[[self.tableView indexPathForCell: cell].row]; 
    respectivePerson.name = newText; 
} 

-(void)personCell:(PersonCell *)cell surnameTextfieldDidChange:(NSString *)newText 
{ 
    Person *respectivePerson = _peopleArray[[self.tableView indexPathForCell: cell].row]; 
    respectivePerson.surname = newText; 
} 

- (IBAction)addItemBtnClick:(id)sender 
{ 
    Person *newPerson = [Person new]; 

    [_peopleArray addObject: newPerson]; 

    [self.tableView reloadData]; 
} 

@end 

當我點擊添加,我得到沒有任何重複如下表,當我滾動:

enter image description here

+0

我試圖從cellForRowAtIndexPath()中的數據源中填充單元格...但隨後單元格獲得隨機值並仍然出現問題。你能建議我有其他的選擇嗎?請告訴我如何爲每個項目分配init新單元格cellForRowAtIndexPath? –

+0

@AkshayAmbekar看看我剛剛添加的示例。繼續詢問你是否不確定某件事。 – pnizzle

+0

無法使用UItextField –

1

我認爲你的問題是,在你添加了一個單元格後,它不會顯示在表格中。在您的itemArray字典中進行更改後,重新加載您的tableview的數據。

在swift中看起來像這樣,但我相信你可以在目標c中找到相同的代碼。

yourTableViewOutlet.reloadData() 

無論何時您更改字典用於填充/定義您的tableView數據,只需重新加載您的數據。

0

你應該把這個當你插入或刪除的UITableViewCell:

**[self.tableView beginUpdates];** 
if ([itemsArray count]) { 
[itemsArray removeLastObject]; 
NSIndexPath *index = [NSIndexPath indexPathForRow:0 inSection:0]; 
AddItemTableViewCell *Cell = (AddItemTableViewCell *)[self.tableView cellForRowAtIndexPath:index]; 
UITextField * name = (UITextField *)[Cell.contentView viewWithTag:11]; 
UITextField * Qty = (UITextField *)[Cell.contentView viewWithTag:12]; 
NSMutableDictionary *item = [NSMutableDictionary new]; 
[item setObject:name.text forKey:@"item"]; 
[item setObject:Qty.text forKey:@"quantity"]; 
[itemsArray addObject:item]; 

} 
[itemsArray addObject:@{@"item":@"",@"quantity":@""}]; 
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
[self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 

**[self.tableView endUpdates];** 
相關問題