Добавление ячеек программно в UITableView - PullRequest
12 голосов
/ 24 февраля 2012

Я только недавно начал программировать для iPhone, и я делаю приложение, которое подключается к базе данных, получает набор имен строк и отображает их. При выборе цвет фона строк изменяется, т.е. вы можете сделать несколько выделений, и все они будут разных цветов. Поэтому я без проблем получаю XML обратно с сервера и создал UITableView для отображения ячеек. Однако я не знаю, как добавить ячейки в таблицу. Я посмотрел на insertRowsAtIndexPaths, но я не уверен, как его использовать? Как я понимаю, insertRowsAtIndexPaths принимает два параметра:

NSArray, который содержит, в какой строке должна находиться ячейка и в каком разделе. Проблема в том, что мое приложение будет иметь динамическое количество строк. Как мне создать NSArray, если я не знаю, сколько у меня будет строк? Могу ли я использовать NSMutableArray?

Второй параметр - анимация - это довольно просто.

Еще одна проблема, с которой я сталкиваюсь, - где я на самом деле создаю клетки? Как вы передаете клетки в таблицу?

Я пытался прочитать документацию, но она не совсем понятна! Вот код, который у меня есть на данный момент внутри метода loadview контроллера представления:

 //Before this I get the XML from the server so I am ready to populate
 //cells and add them to the table view
 NSArray *cells = [NSArray arrayWithObjects:
                   [NSIndexPath indexPathForRow:0 inSection:0],
                   [NSIndexPath indexPathForRow:1 inSection:0],
                   [NSIndexPath indexPathForRow:2 inSection:0],
                   [NSIndexPath indexPathForRow:3 inSection:0],
                   [NSIndexPath indexPathForRow:4 inSection:0],
                   [NSIndexPath indexPathForRow:5 inSection:0],
                   [NSIndexPath indexPathForRow:6 inSection:0],
                   [NSIndexPath indexPathForRow:7 inSection:0],
                   [NSIndexPath indexPathForRow:8 inSection:0],
                   [NSIndexPath indexPathForRow:9 inSection:0],
                   [NSIndexPath indexPathForRow:10 inSection:0],
                   [NSIndexPath indexPathForRow:11 inSection:0],
                   [NSIndexPath indexPathForRow:12 inSection:0],
                   nil];
[eventTypesTable beginUpdates];
[eventTypesTable insertRowsAtIndexPaths:cells withRowAnimation:UITableViewRowAnimationNone];
[eventTypesTable endUpdates];

Ответы [ 4 ]

18 голосов
/ 24 февраля 2012

Я думаю, что вы подходите к этому с неправильной стороны.UITableViews не работают так, как вы ожидаете.insertRowsAtIndexPaths предназначен для вставки новых строк в таблицу, а не для ее заполнения в первом случае.

UITableViews работают, вызывая ряд методов-делегатов, которые позволяют вам представлять ваши данные в виде таблицы, как вынужно.Затем фреймворк берет на себя тяжелую работу по заполнению ячеек, обработке прокрутки и сенсорных событий и т. Д.

Я бы порекомендовал вам начать с чтения учебника, такого как этот: http://www.iosdevnotes.com/2011/10/uitableview-tutorial/, которыйвыглядит довольно тщательно для меня.В нем объясняется, как установить источник данных для таблицы и как вы можете настроить способ представления ваших данных в UITableView.

Удачи!

16 голосов
/ 24 февраля 2012

Не нужно использовать insertRowsAtIndexPaths.

Проверка: Ссылка на протокол UITableViewDataSource и Ссылка на класс UITableView

Волшебство происходит между этими тремя методами (методы протокола UITableViewDataSource):

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

Вам просто нужно заполнить массив. Да, это может быть NSMutableArray.

Вы можете заполнить массив в - (void)viewDidLoad, например:

yourItemsArray = [[NSMutableArray alloc] initWithObjects:@"item 01", @"item 02", @"item 03", nil];

И они используют методы источника данных, как это:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    // If You have only one(1) section, return 1, otherwise you must handle sections
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return [yourItemsArray count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell...
    cell.textLabel.text = [yourItemsArray objectAtIndex:indexPath.row];

    return cell;
}

Как и в этом случае ячейки будут созданы автоматически.

Если вы меняете массив, просто нужно позвонить:

[self.tableView reloadData];
2 голосов
/ 30 июня 2012
//######## Adding new section programmatically to UITableView    ############

  @interface MyViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>
    {
        IBOutlet UITableView *tblView;
        int noOfSection;
    }
    -(IBAction)switchStateChanged:(id)sender;
    @end



    @implementation MyViewController
    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
            // Custom initialization
        }
        return self;
    }
    - (void)viewDidLoad{
        [super viewDidLoad];

        noOfSection = 2;
    }
    - (void)viewDidUnload{
        [super viewDidUnload];
    }
    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
        if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {

            return YES;
        }

        return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
    }
    #pragma mark - TableView Delegate Methods
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
        return noOfSection;
    }
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

        return 1;
    }
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
        if(indexPath.section == 2){
            return 200;
        }
        return  50;
    }

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

        static NSString *CellIdentifier = @"Cell";

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];

            UISwitch *switchBtn = [[UISwitch alloc] initWithFrame:CGRectMake(0, 0, 20, 10)];
            cell.accessoryView = switchBtn; 

            [switchBtn addTarget:self action:@selector(switchStateChanged:) forControlEvents:UIControlEventValueChanged];
            cell.textLabel.font = [UIFont systemFontOfSize:14];
            cell.detailTextLabel.font = [UIFont systemFontOfSize:11];
            cell.textLabel.numberOfLines = 2;
            cell.detailTextLabel.numberOfLines = 2;
        }



        if(indexPath.section == 0){
            cell.textLabel.text = @"Cell-1 Text";
            cell.detailTextLabel.text = @"Cell-1 Detail text";
        }
        else if(indexPath.section == 1){
            cell.textLabel.text = @"Cell-2 Text";
        }
        else { // new added section code is here...
            cell.textLabel.text = @"New Added section";
        }
        [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
        return cell;
    }
    -(IBAction)switchStateChanged:(id)sender{
        UISwitch *switchState = sender;

        if(switchState.isOn == YES){
            NSLog(@"ON");
            NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:2];
            [self insertNewSectionWithIndexPath:indexPath];
        }
        else {
            NSLog(@"OFF");
            [self removeSectionWithIndexPath:[NSIndexPath indexPathForRow:0 inSection:2]];
        }
    }
    -(void)insertNewSectionWithIndexPath:(NSIndexPath *)indexPath{


        noOfSection = 3;
        [tblView insertSections:[NSIndexSet indexSetWithIndex:2] withRowAnimation:UITableViewRowAnimationFade];
    }
    -(void)removeSectionWithIndexPath:(NSIndexPath *)indexPath{
        noOfSection = 2;
        [tblView deleteSections:[NSIndexSet indexSetWithIndex:2] withRowAnimation:UITableViewRowAnimationFade];
    }
    @end
0 голосов
/ 24 февраля 2012

Вам не нужно беспокоиться об этом.ячейки будут созданы автоматически.просто посмотрите на эти Ссылка на класс UITableview

Tableview_iPhone

Вы должны реализовать UITableView dataSource и делегировать протокол.Также посмотрите этот урок Урок UITableview

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...