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

106

J'ai créé un UITableViewdans Interface Builder en utilisant storyboards. Le UITableViewest configuré avec static cellset un certain nombre de sections différentes.

Le problème que je rencontre est que j'essaie de configurer mon application dans plusieurs langues différentes. Pour ce faire, je dois être en mesure de changer les UITableViewtitres des sections d'une manière ou d'une autre.

S'il vous plaît, quelqu'un peut-il m'aider? Idéalement, j'aimerais aborder le problème en utilisant, IBOutletsmais je soupçonne que ce n'est même pas possible dans ce cas. Tous les conseils et suggestions seraient vraiment appréciés.

Merci d'avance.

Le chimpanzé fou
la source

Réponses:

280

Une fois que vous avez connecté votre UITableView delegateet datasourcevotre contrôleur, vous pouvez faire quelque chose comme ceci:

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;
}

Rapide

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
}
Alladinien
la source
Vous êtes sûr que cela est réellement appelé si vous configurez le storyboard en utilisant des cellules statiques? Je n'ai pas l'air de l'invoquer.
tirage le
7
Ah, il semble que vous deviez mettre numberOfSectionsInTableView:tableView:en œuvre pour le faire appeler.
tirage le
Pour les cellules statiques, (la plupart) toutes les autres méthodes de source de données ne sont pas implémentées.
wcochran
2
@drewish numberOfSectionsInTableView:tableView:implémenté dans IB pour les cellules statiques.
wcochran
drewish a raison - si vous implémentez numberOfSectionsInTableView:, alors la méthode title est appelée et surérode le storyboard. Puisqu'il s'agit d'une vue de table statique, il est tout à fait normal de la remplacer par une méthode qui renvoie un nombre constant @wcochran
GreatWiz
16

Si vous écrivez du code en 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"
    }
}
BCI
la source
10

Utilisez la méthode UITableViewDataSource

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
geraldWilliam
la source
5

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

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

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

Julian D.
la source
2
- (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 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;
}
Manjeet
la source
2

Rien de mal avec les autres réponses mais celle-ci offre une solution non programmatique qui peut être utile dans les situations où l'on a une petite table statique. L'avantage est que l'on peut organiser les localisations à l'aide du storyboard. On peut continuer à exporter des localisations depuis Xcode via des fichiers XLIFF. Xcode 9 dispose également de plusieurs nouveaux outils pour faciliter les localisations .

(original)

J'avais une exigence similaire. J'avais 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), sélectionnez simplement la section dans le storyboard et notez l'ID de l'objet

ID d'objet

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

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

Ressources supplémentaires:

igoMobile
la source
1

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

   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 le delegatepour remplir votre table avec des données.

Morgan Wilde
la source