Использование статического UITableViewController для создания двух разделов с первым разделом, имеющим нестатическое количество ячеек

У меня есть UITableViewController, который я создаю в своем приложении. Этот UITableViewController (SelectedLanguages) вызывается из другого UITableViewController (ChooseLanguage), где есть статический список языков для выбора пользователем.

В SelectedLanguages UITableViewController я хочу добиться следующего:

  • 2 секции
  • Первый раздел будет иметь от 1 до 5 ячеек
  • Второй раздел всегда будет иметь 12 ячеек.

Количество ячеек в первом разделе полностью зависит от того, какой язык пользователь выбирает в ChooseLanguage UITableViewController. Например, щелчок по английскому языку будет означать, что первый раздел в SelectedLanguage UITableViewController будет иметь 5 ячеек, но выбор French в ChooseLanguage UITableViewController будет означать, что первый раздел в SelectedLanguage будет иметь только 1 ячейку.

Как уже упоминалось, второй раздел всегда будет иметь 12 ячеек в SelectedLanguage.

Я разработал этот UITableViewController в Interface Builder. Что я видел, так это то, что только если Content указан как Static Cells, у вас может быть несколько «разделов».

Даже если вы установите для параметра «Контент» значение «Динамический» и «Сгруппированный», я не могу найти способ определить разделы, кроме как в коде.

Причина, по которой я определяю это в Interface Builder, заключается в том, что раздел 1 и раздел 2 должны иметь очень индивидуальный макет размера ячеек, а также метки, которые входят в каждую ячейку.

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

Мой вопрос: как мне установить количество ячеек в верхнем разделе в коде?

В prepareForSegue для ChooseLanguage я мог бы проверить заголовок вызываемой ячейки, а затем выполнить какое-либо действие в SelectedTransactions. Действие, которое нужно выполнить здесь, - это то, что меня смущает.

Я знаю, что в UITableView Data Source есть метод - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section, но я не знаю, как и что с ним делать в моей конкретной ситуации.

Любое руководство будет действительно оценено.


person amitsbajaj    schedule 12.08.2015    source источник


Ответы (2)


Мой самый простой ответ на ваш вопрос ниже

в .m импортировать "ViewController.h"

     @interface ViewController () 
     {
       NSMutableArray *arraysection1;
       NSMutableArray *arraysection2;

     }
     @end

     @implementation ViewController

     - (void)viewDidLoad 
     {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        arraySection1 = [[NSMutableArray alloc]initWithObjects:@"One",@"Two",@"Three",@"Four",@"Five",nil];
        arraySection2 = [[NSMutableArray alloc]initWithObjects:@"1",@"2",@"3",@"4",@"5",nil];
     }

  #UITableView Delegate Methods

     #UITableView DataSource Methods
     - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
     {
        //If you have 2 sections,
        return 2;
     }
     -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
     {
        //set row of two sections with condition
        if(section==0)
        {
           return arraySection1.count;
        }
        else
        {
           return arraySection2.count;
        }

     }
     -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
     {
        static NSString *strCellIdentifier = @"CellIndentifier";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:strCellIdentifier];
        if (cell == nil) 
        {
           cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:strCellIdentifier];
       }

       if(indexPath.section==0)
       {
          cell.textLabel.text = [NSString stringWithFormat:@"%@",[arraySection1 objectAtIndex:indexPath.row]];
          NSLog(@"The textLabel is-%@",cell.textLabel.text);
       }
       else
       {
         cell.textLabel.text = [NSString stringWithFormat:@"%@",[arraySection2 objectAtIndex:indexPath.row]];
         NSLog(@"The textLabel is-%@",cell.textLabel.text);
       }
       return cell;
     }

    #UITableView Delegate Methods
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
       if(indexPath.section==0)
       {
          if(indexPath.row==0)
          {
            //Do whatever you want here
          }
          else if(indexPath.row==1)
          {
            //Do whatever you want here
          }
          else if(indexPath.row==2)
          {
            //Do whatever you want here
          }
          else if(indexPath.row==3)
          {
            //Do whatever you want here
          }
          else 
          {
            //Do whatever you want here
          }

       }
       else
       {
          if(indexPath.row==0)
          {
            //Do whatever you want here
          }
          else if(indexPath.row==1)
          {
            //Do whatever you want here
          }
          else if(indexPath.row==2)
          {
            //Do whatever you want here
          }
          else if(indexPath.row==3)
          {
            //Do whatever you want here
          }
          else 
          {
            //Do whatever you want here
          }
       }
    }
person user3182143    schedule 12.08.2015
comment
Большое спасибо за ответ. Могу ли я по-прежнему использовать IB для создания пользовательских вложенных меток и т. д. (которые не нужно обновлять в коде) и использовать ваш код таким же образом? - person amitsbajaj; 12.08.2015
comment
Да, используйте мой код, который я опубликовал. Потому что я написал статическую ячейку в соответствии с вашим вопросом. - person user3182143; 12.08.2015
comment
Определенно вы можете получить решение. - person user3182143; 12.08.2015
comment
Если мой код полезен для вас, пожалуйста, отметьте и дайте мне оценку, потому что это очень полезно для других, если они увидят ваш вопрос. - person user3182143; 12.08.2015
comment
Большое спасибо - это имеет смысл, и я ценю вашу помощь. - person amitsbajaj; 12.08.2015

Из того, что вы описываете, похоже, что ваш tableView должен быть динамическим.

Вам придется обрабатывать это программно, забудьте о конструкторе интерфейсов.

Вот что вам нужно:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 2;//2 Sections
}


-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

    switch (section) {
        case 0:
            //The first section will have between 1 and 5 cells
            //Put the logic to return the correct number of cells
            return 5;
            break;
        case 1:
            //The second section will always have 12 cells.
            return 12;
            break;                
        default:
            break;
    }
    return 0;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];

    switch (indexPath.section) {
        case 0:
            [[cell textLabel] setText:@"same title section 1"];
            break;
        case 1:
            [[cell textLabel] setText:@"same title section 2"];
            break;

        default:
            break;
    }
    return cell;
}
person meda    schedule 12.08.2015
comment
Большое спасибо @meda - это очень полезно. Я новичок в программировании, и я не хочу слишком много возиться с кодом для чего-то, что я мог бы сделать в Interface Builder. 12 ячеек во втором разделе всегда будут иметь одинаковые заголовки, а первый раздел всегда будет содержать одинаковые заголовки для всех 5; это просто случай того, сколько я показываю. Итак, в коде, который у вас есть, в строках и там, где вы сказали поместить логику, могу ли я указать правильное количество ячеек на основе ячейки, на которую я щелкнул в предыдущем UITableView? - person amitsbajaj; 12.08.2015
comment
Вы знаете, интерфейс не такой гибкий, я обновил свой код, чтобы показать вам, как ставить заголовки. что касается логики, она может быть основана на условии или, возможно, на подсчете массива вашего источника данных. - person meda; 12.08.2015
comment
Большое спасибо и абсолютно точно, я действительно буду работать над тем, чтобы понять, как это сделать в коде. Я ценю ваш ответ. - person amitsbajaj; 12.08.2015