web-dev-qa-db-fra.com

Comment définir le titre de la section UITableView par programme (iPhone / iPad)?

J'ai créé un UITableView dans Interface Builder avec storyboards. La UITableView est configurée avec static cells et un certain nombre de sections différentes.

Le problème que je rencontre est que j'essaie de configurer mon application dans plusieurs langues. Pour ce faire, je dois pouvoir modifier les titres de la section UITableView.

S'il vous plaît, quelqu'un peut-il m'aider? Dans l’idéal, j’aimerais aborder le problème en utilisant IBOutlets mais je pense que cela n’est même pas possible dans ce cas. Tous les conseils et suggestions seraient vraiment appréciés.

Merci d'avance.

105
The Crazy Chimp

Une fois que vous avez connecté votre UITableView delegate et datasource à votre contrôleur, vous pouvez procéder comme suit:

ObjC

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {

    NSString *sectionName;
    switch (section) {
        case 0:
            sectionName = NSLocalizedString(@"mySectionName", @"mySectionName");
            break;
        case 1:
            sectionName = NSLocalizedString(@"myOtherSectionName", @"myOtherSectionName");
            break;
        // ...
        default:
            sectionName = @"";
            break;
    }    
    return sectionName;
}

Swift

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {

    let sectionName: String
    switch section {
        case 0:
            sectionName = NSLocalizedString("mySectionName", comment: "mySectionName")
        case 1:
            sectionName = NSLocalizedString("myOtherSectionName", comment: "myOtherSectionName")
        // ...
        default:
            sectionName = ""
    }
    return sectionName
}
274
Alladinian

Si vous écrivez du code dans Swift, cela ressemblerait à un exemple comme celui-ci

func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String?
{
    switch section
    {
        case 0:
            return "Apple Devices"
        case 1:
            return "Samsung Devices"
        default:
            return "Other Devices"
    }
}
15
BCI

Utilisez la méthode UITableViewDataSource

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
10
geraldWilliam

titleForHeaderInSection est une méthode de délégué de UITableView afin d'appliquer le texte d'en-tête de la section écrite comme suit,

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
              return @"Hello World";
}
5
iAnkit

Notez que -(NSString *)tableView: titleForHeaderInSection: n'est pas appelé par UITableView si - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section est implémenté dans le délégué de UITableView;

3
Julian D.

Les autres réponses n’ont rien d’erreur, mais celle-ci offre une solution non programmatique qui peut être utile dans les situations où l’on dispose d’un petit tableau statique. L'avantage est que l'on peut organiser les localisations à l'aide du storyboard. Vous pouvez continuer à exporter des localisations à partir de Xcode via des fichiers XLIFF. Xcode 9 a également plusieurs nouveaux outils pour rendre les localisations plus faciles.

(original)

J'ai eu une exigence similaire. J'ai eu une table statique avec des cellules statiques dans mon Main.storyboard (Base). Pour localiser les titres de section à l’aide de fichiers .string, par exemple Main.strings (allemand) suffit de sélectionner la section dans le storyboard et de noter l'ID d'objet

Object ID

Ensuite, allez dans votre fichier de chaîne, dans mon cas Main.strings (allemand) et insérez la traduction comme suit:

"MLo-jM-tSN.headerTitle" = "Localized section title";

Ressources additionnelles:

2
igoMobile
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
   return 45.0f; 
//set height according to row or section , whatever you want to do!
}

le texte de l'étiquette de la section est défini.

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    UIView *sectionHeaderView;

        sectionHeaderView = [[UIView alloc] initWithFrame:
                             CGRectMake(0, 0, tableView.frame.size.width, 120.0)];


    sectionHeaderView.backgroundColor = kColor(61, 201, 247);

    UILabel *headerLabel = [[UILabel alloc] initWithFrame:
                            CGRectMake(sectionHeaderView.frame.Origin.x,sectionHeaderView.frame.Origin.y - 44, sectionHeaderView.frame.size.width, sectionHeaderView.frame.size.height)];

    headerLabel.backgroundColor = [UIColor clearColor];
    [headerLabel setTextColor:kColor(255, 255, 255)];
    headerLabel.textAlignment = NSTextAlignmentCenter;
    [headerLabel setFont:kFont(20)];
    [sectionHeaderView addSubview:headerLabel];

    switch (section) {
        case 0:
            headerLabel.text = @"Section 1";
            return sectionHeaderView;
            break;
        case 1:
            headerLabel.text = @"Section 2";
            return sectionHeaderView;
            break;
        case 2:
            headerLabel.text = @"Section 3";
            return sectionHeaderView;
            break;
        default:
            break;
    }

    return sectionHeaderView;
}
2
Manjeet

Je ne connais pas les versions antérieures des protocoles UITableView, mais à partir d'iOS 9, func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? fait partie du protocole UITableViewDataSource.

   class ViewController: UIViewController {

      @IBOutlet weak var tableView: UITableView!

      override func viewDidLoad() {
         super.viewDidLoad()
         tableView.dataSource = self
      }
   }

   extension ViewController: UITableViewDataSource {
      func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
         return "Section name"
      }
   }

Vous n'avez pas besoin de déclarer la delegate pour remplir votre tableau avec des données.

1
Morgan Wilde