Bagaimana cara mengatur judul Bagian UITableView secara terprogram (iPhone / iPad)?

106

Saya telah membuat UITableViewdi Interface Builder menggunakan storyboards. Ini UITableViewdiatur denganstatic cells dan sejumlah bagian yang berbeda.

Masalah yang saya alami adalah saya mencoba menyiapkan aplikasi saya dalam beberapa bahasa berbeda. Untuk melakukan ini, saya harus dapat mengubah UITableViewjudul bagian.

Tolong bisakah seseorang membantu saya? Idealnya saya ingin mendekati masalah menggunakan IBOutletsnamun saya curiga ini bahkan tidak mungkin dalam kasus ini. Setiap saran dan saran akan sangat dihargai.

Terima kasih sebelumnya.

The Crazy Chimp
sumber

Jawaban:

280

Setelah Anda menghubungkan UITableView delegatedan datasourceke pengontrol Anda, Anda dapat melakukan sesuatu seperti ini:

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

Cepat

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
}
Alladinian
sumber
Anda yakin itu benar-benar dipanggil jika Anda menyiapkan papan cerita menggunakan sel statis? Saya sepertinya tidak dipanggil.
menarik
7
Ah, sepertinya Anda harus menerapkannya numberOfSectionsInTableView:tableView:agar dapat dipanggil.
menarik
Untuk sel statis, (sebagian besar) semua metode sumber data lainnya tidak diterapkan.
wcochran
2
@drewish numberOfSectionsInTableView:tableView:diimplementasikan di IB untuk sel statis.
wcochran
drewish benar - jika Anda menerapkannya numberOfSectionsInTableView:, maka metode judul akan dipanggil dan mengesampingkan storyboard. Karena ini adalah tableview statis maka cukup oke untuk menimpanya dengan metode yang mengembalikan angka konstan @wcochran
GreatWiz
16

Jika Anda menulis kode di Swift, itu akan terlihat sebagai contoh seperti ini

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
sumber
10

Gunakan metode UITableViewDataSource

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

titleForHeaderInSection adalah metode delegasi UITableView sehingga untuk menerapkan teks header dari bagian tulis sebagai berikut,

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

Perhatikan bahwa -(NSString *)tableView: titleForHeaderInSection:tidak dipanggil oleh UITableView jika - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)sectiondiimplementasikan dalam delegasi UITableView;

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

teks label bagian disetel.

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

Tidak ada yang salah dengan jawaban lain tetapi yang satu ini menawarkan solusi non-programatik yang mungkin berguna dalam situasi di mana seseorang memiliki tabel statis kecil. Manfaatnya adalah seseorang dapat mengatur pelokalan menggunakan storyboard. Seseorang dapat terus mengekspor pelokalan dari Xcode melalui file XLIFF. Xcode 9 juga memiliki beberapa alat baru untuk mempermudah pelokalan .

(asli)

Saya memiliki persyaratan serupa. Saya memiliki tabel statis dengan sel statis di Main.storyboard (Base) saya. Untuk melokalkan judul bagian menggunakan file .string misalnya Main.strings (Jerman) cukup pilih bagian di storyboard dan catat Object ID

ID Objek

Setelah itu masuk ke file string Anda, dalam kasus saya Main.strings (Jerman) dan masukkan terjemahannya seperti:

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

Sumber daya tambahan:

igoMobile
sumber
1

Saya tidak tahu tentang versi UITableViewprotokol sebelumnya, tetapi pada iOS 9, func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String?adalah bagian dari UITableViewDataSourceprotokol.

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

Anda tidak perlu mendeklarasikan delegateuntuk mengisi tabel Anda dengan data.

Morgan Wilde
sumber