UITableView Bölüm başlığı programlı olarak nasıl ayarlanır (iPhone / iPad)?


106

Ben oluşturduk UITableViewkullanarak Interface Builder storyboards. UITableViewİle kurulum static cellsve farklı bölümlerden bir sayı.

Yaşadığım sorun, uygulamamı birkaç farklı dilde kurmaya çalışmam. Bunu yapmak için UITableViewbölüm başlıklarını bir şekilde değiştirebilmem gerekiyor .

Lütfen birisi bana yardım edebilir mi? İdeal olarak soruna kullanarak yaklaşmak isterim, IBOutletsancak bu durumda bunun mümkün olmadığından şüpheleniyorum. Herhangi bir tavsiye ve öneri gerçekten takdir edilecektir.

Şimdiden teşekkürler.

Yanıtlar:


280

UITableView'unuzu delegateve datasourcekontrol cihazınıza bağladıktan sonra , şöyle bir şey yapabilirsiniz:

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
}

Hikaye panosunu statik hücreler kullanarak kurarsanız, gerçekten çağrılacağından emin misiniz? Çağrılmış gibi görünmüyorum.
drewish

7
Ah, onu çağırmak için uygulamanız numberOfSectionsInTableView:tableView:gerekiyor gibi görünüyor .
drewish

Statik hücreler için (çoğu) diğer tüm veri kaynağı yöntemleri uygulanmaz.
wcochran

2
@drewish numberOfSectionsInTableView:tableView:statik hücreler için IB'de uygulanmıştır.
wcochran

Drew haklıdır - uygularsanız numberOfSectionsInTableView:, o zaman başlık yöntemi çağrılır ve film şeridini geçersiz kılar. Bu statik bir tablo görünümü olduğundan
@wcochran

16

Swift ile kod yazıyorsanız, bunun gibi bir örnek olarak görünecektir.

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

10

UITableViewDataSource yöntemini kullanın

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

5

titleForHeaderInSection , UITableView'ın bir temsilci yöntemidir, bu nedenle bölüm yazma üstbilgi metnini aşağıdaki gibi uygulamak için,

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

3

-(NSString *)tableView: titleForHeaderInSection:UITableView - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)sectiontemsilcisinde uygulanıyorsa bunun UITableView tarafından çağrılmadığını unutmayın ;


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

bölüm etiketi metni ayarlandı.

- (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

Diğer cevaplarda yanlış bir şey yok ama bu, birinin küçük bir statik tablonun olduğu durumlarda yararlı olabilecek programatik olmayan bir çözüm sunuyor. Yararı, yerelleştirmeleri storyboard kullanarak organize edebilmesidir. XLIFF dosyaları aracılığıyla Xcode'dan yerelleştirmeleri dışa aktarmaya devam edilebilir. Xcode 9 ayrıca yerelleştirmeleri kolaylaştırmak için birkaç yeni araca sahiptir .

(orijinal)

Benzer bir ihtiyacım vardı. Main.storyboard'umda (Base) statik hücrelerle statik bir tablom vardı. Ana dizeleri (Almanca) gibi .string dosyalarını kullanarak bölüm başlıklarını yerelleştirmek için film şeridindeki bölümü seçin ve Nesne Kimliğini not edin

Nesne Kimliği

Daha sonra dize dosyanıza gidin, benim durumumda Main.strings (Almanca) ve çeviriyi aşağıdaki gibi ekleyin:

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

Ek kaynaklar:


1

UITableViewProtokollerin geçmiş sürümlerini bilmiyorum , ancak iOS 9 func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String?itibariyle UITableViewDataSourceprotokolün bir parçası .

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

delegateTablonuzu verilerle doldurmak için belirtmenize gerek yoktur .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.