2012-05-02 2 views
7

Изначально у меня есть табличный вид с одной кнопкой добавления.Как добавить строки/ячейки динамически в UITableView, нажав кнопку в iPhone.

, когда пользователь нажимает на эту кнопку, мне нужно увеличивать клетки подсчета и добавить клетки следующим образом

Как написать количество строк и как добавить новые строки, нажав на кнопку добавления

// Роу кол-во

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return **????** ; 
} 

// Содержимое на клетки/строки

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

// ### Добавить строку .. ###

-(IBAction)myAction:(id)sender 
{ 
    ???????? ; 
} 

Спасибо заранее ...

+2

В принципе, вы не добавляете их в представление, а скорее в модель. После того, как вы это сделали, метод tableloads reloadData - ваш друг – HeikoG

ответ

7

В приложении Вы должны добавить значения в массив при выполнении действия в БТН.

Например, в вашем табличном представлении вы показываете NSString в cell.textLABEL.text. Эти строки находятся в NSMutableArray.

Теперь, когда buttonAction называется

в MyAction

{ 
    NSString *newString [email protected]"NEW CELL"; 

    [tableArray addObject:newString]; 
    [tableView reloadData]; 
} 

Попробуйте эту логику в приложении в отношении к вашей покадрово.

Надеюсь, эта логика будет полезна для вас.

+0

Да это прекрасно работает \ – Ranga

+2

Это будет работать, но это приводит к ухудшению производительности. Чтобы добавить новую перезагрузку ячеек, все UITableview не имеет смысла. –

+3

согласился с Навином. Вместо этого используйте insertRowsAtIndexPaths – MANN

11

UITableView имеет свойство вставить строку или раздел. см. Apple Doc

Существует много учебников по этому вопросу. 2 обычно используются для добавления/удаления строки/раздела.

insertRowsAtIndexPaths:withRowAnimation: 
deleteRowsAtIndexPaths:withRowAnimation: 

Я отправил аналогичный ответ, как использовать это: Hiding the table view cells with switch ON/OFF in iPhone

+0

Ваша ссылка для учебника не загружается, пожалуйста, напишите обновленную ссылку. он показывает ошибку oops. любые способы поблагодарить вас за ваш быстрый ответ – Ranga

+0

попробуйте следующее:: http: //stackoverflow.com/questions/9339186/hiding-the-table-view-cells-with-switch-on-off-in-iphone – HelmiB

0

Вы можете просто добавить объект в массив и перезагрузить табличное представление при нажатии кнопки.

[array addobject:@""]; 
[tableview reloaddata]; 
7

Перезагрузка просмотра таблицы каждый раз, когда вы хотите добавить или удалить строку, создает плохой опыт для пользователя вашего приложения. Несмотря на то, что это не эффективный способ выполнения этой задачи, он также имеет некоторые отрицательные побочные эффекты: выбранные строки не остаются выбранными после перезагрузки, а изменение не анимируется.

UITableView имеет методы, которые были созданы для динамического изменения содержимого табличного представления.К ним относятся:

insertRowsAtIndexPaths:withRowAnimation: 
moveRowAtIndexPath:toIndexPath: 
deleteRowsAtIndexPaths:withRowAnimation: 

Обратите внимание, что эти методы позволяют указать тип анимации, который будет использоваться, когда указанная операция выполняется - вы не можете достичь такого поведения, когда вы используете reloadData изменить содержание представления таблицы ,

Кроме того, вы можете даже объединить несколько операций просмотра таблицы с использованием дополнительных методов представления таблицы (это не обязательно):

beginUpdates endUpdates

Просто оберните операции, которые нужно выполнить в вызовы beginUpdates и endUpdates методы и представление таблицы создадут один анимация для всех операций, которые были запрошены между beginUpdates и endUpdates, так что весь переход выглядит более приятным, чем тот, который создается несколькими отдельными анимациями.

[self.tableView beginUpdates] 
//calls to insert/move and delete methods 
[self.tableView endUpdates] 

Это действительно важно, чтобы держать вас в состояние источника данных в соответствии с одним хранящейся UITableView. По этой причине вы должны убедиться, что, когда представление таблицы начнет выполнять запрошенные операции, его источник данных вернет правильные значения.

[self.tableView beginUpdates] 
//calls to insert/move and delete methods 
//operations on our data source so that its 
//state is consistent with state of the table view 
[self.tableView endUpdates] 

Когда рабочий стол начинает выполнять операции? Это зависит от того, находятся ли операции в блоке анимации, определяемые методами beginUpdates и endUpdates. Если да, представление таблицы начинает выполнять операции после вызова метода endUpdates. В противном случае представление таблицы выполняет операции сразу после того, как был сделан вызов метода insert/move или delete.

Когда вы используете методы для работы над табличным представлением beginUpdates и , вы должны знать, что в этом случае вид таблицы, запрошенные партии и выполняют их в определенном порядке, который не является необходимым, как порядок вызовов вы сделали на вашем объекте просмотра таблицы (Apple's documentation on this topic).

Самое главное помнить, что удаление всех операций всегда выполняется перед всеми операциями вставки. Кроме того, операции удаления, по-видимому, выполняются в порядке убывания (операции для индексов 3, 2, 1), когда операция вставки выполняется в порядке возрастания (операции для индексов 1, 2, 3). Помните об этом критический в состоянии хранения вашего источника данных в соответствии с сохраненным табличным представлением.

Проведите некоторое время на анализ порядка операций с источником данных и представлением таблицы в представленном ниже примере.

Заключительный пример:

//initial state of the data source 
self.numbers = [@[@(0), @(1), @(2), @(3), @(4), @(5), @(6)] mutableCopy]; 
// 
//... 
// 

NSArray indexPathsToRemove = @[[NSIndexPath indexPathForRow:3 section:0]. 
           [NSIndexPath indexPathForRow:0 section:0]; 
NSArray indexPathsToAdd = @[[NSIndexPath indexPathForRow:6 section:0], 
          [NSIndexPath indexPathForRow:5 section:0]]; 

[self.tableView beginUpdates]; 

[self.numbers removeObjectAtIndex:3]; 
[self.numbers removeObjectAtIndex:0]; 

[self.numbers insertObject:@(10) atIndex:4]; 
[self.numbers insertObject:@(11) atIndex:5]; 

[self.tableView insertRowsAtIndexPaths:indexPathsToAdd withRowAnimation:UITableViewRowAnimationAutomatic]; 
[self.tableView deleteRowsAtIndexPaths:indexPathsToRemove withRowAnimation:UITableViewRowAnimationAutomatic]; 

[self.tableView endUpdates]; 
//final state of the data source ('numbers') - 1, 2, 4, 5, 6, 10, 11 
2

Есть и другие правильные ответы здесь (которые вы должны читать, потому что они идут дальше в глубину), но я изо всех сил в течение недели с этим после прочтения все решения я мог потому что не было (что я нашел!) с исчерпывающими примерами.

Правила для этой работы: 1. Изменения должны быть сделаны непосредственно в массив, который содержит элементы, которых вы показываете в UITableView.Если вы установили какое-либо значение в UITableViewCell в методе tableView:cellForRowAtIndexPath: равным значению в self.expandableArray, тогда изменения должны быть сделаны также, чтобы эти методы работали.

  1. изменения в массив элементов, которые отображаются в Tableview должны быть сделаны в период между[tableView beginUpdates] и [tableView endUpdates]
  2. Граф массива indexPaths должно равняться кол дополнительных пунктов, которые Вы» повторное добавление в таблицуView (я думаю, это очевидно, но это не помешает указать это)

вот очень простой пример, который будет работать сам по себе.

@interface MyTableViewController() 
@property (nonatomic, strong) NSMutableArray *expandableArray; 
@property (nonatomic, strong) NSMutableArray *indexPaths; 
@property (nonatomic, strong) UITableView *myTableView; 
@end 

@implementation MyTableViewController 

- (void)viewDidLoad 
{ 
    [self setupArray]; 
} 

- (void)setupArray 
{ 
    self.expandableArray = @[@"One", @"Two", @"Three", @"Four", @"Five"].mutableCopy; 
} 

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

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //here you should create a cell that displays information from self.expandableArray, and return it 
} 

//call this method if your button/cell/whatever is tapped 
- (void)didTapTriggerToChangeTableView 
{ 
    if (/*some condition occurs that makes you want to expand the tableView*/) { 
     [self expandArray] 
    }else if (/*some other condition occurs that makes you want to retract the tableView*/){ 
     [self retractArray] 
    } 
} 

//this example adds 1 item 
- (void)expandArray 
{ 
    //create an array of indexPaths 
    self.indexPaths = [[NSMutableArray alloc] init]; 
    for (int i = theFirstIndexWhereYouWantToInsertYourAdditionalCells; i < theTotalNumberOfAdditionalCellsToInsert + theFirstIndexWhereYouWantToInsertYourAdditionalCells; i++) { 
     [self.indexPaths addObject:[NSIndexPath indexPathForRow:i inSection:0]]; 
    } 

    //modify your array AND call insertRowsAtIndexPaths:withRowAnimation: INBETWEEN beginUpdates and endUpdates 
    [self.myTableView beginUpdates]; 
    //HERE IS WHERE YOU NEED TO ALTER self.expandableArray to have the additional/new data values, eg: 
    [self.expandableArray addObject:@"Six"]; 
    [self.myTableView insertRowsAtIndexPaths:self.indexPaths withRowAnimation:(UITableViewRowAnimationFade)]; //or a rowAnimation of your choice 

    [self.myTableView endUpdates]; 
} 

//this example removes all but the first 3 items 
- (void)retractArray 
{ 
    NSRange range; 
    range.location = 3; 
    range.length = self.expandableArray.count - 3; 

    //modify your array AND call insertRowsAtIndexPaths:withRowAnimation: INBETWEEN beginUpdates and endUpdates 
    [self.myTableView beginUpdates]; 
    [self.expandableArray removeObjectsInRange:range]; 
    [self.myTableView deleteRowsAtIndexPaths:self.indexPaths withRowAnimation:UITableViewRowAnimationFade]; //or a rowAnimation of your choice 
    [self.myTableView endUpdates]; 
} 

@end 

Надеюсь, это избавит кого-то много времени и головной боли. Если вы сделаете это так, вам не нужно перезагружать весь tableView для его обновления, и вы сможете выбрать для него анимацию. Бесплатный код, не стучите его.

+0

У меня есть что-то подобное. У меня массив с 76 объектами (приблизительно). при заполнении таблицы, таблица может отображать только 10 ячеек за раз. сначала 0-10 объектов, затем нажатие на следующей таблице кнопок должно отображать 11-20 данных, затем 21-30 и т. д. ... так как я могу это сделать? есть ли у вас какие-либо идеи по этому поводу? – Moxarth

Смежные вопросы