Làm cách nào để đặt tiêu đề Phần UITableView theo lập trình (iPhone / iPad)?


106

Tôi đã tạo một UITableViewtrong Trình tạo giao diện bằng cách sử dụng storyboards. Các UITableViewđược thiết lập vớistatic cells và một số phần khác nhau.

Vấn đề tôi đang gặp phải là tôi đang cố thiết lập ứng dụng của mình bằng một số ngôn ngữ khác nhau. Để làm điều này, tôi cần có thể thay đổi UITableViewtiêu đề phần bằng cách nào đó.

Xin ai đó có thể giúp tôi được không? Lý tưởng nhất là tôi muốn tiếp cận vấn đề bằng cách sử dụng IBOutletstuy nhiên tôi nghi ngờ điều này thậm chí không thể thực hiện được trong trường hợp này. Bất kỳ lời khuyên và đề xuất sẽ thực sự được đánh giá cao.

Cảm ơn trước.

Câu trả lời:


280

Khi bạn đã kết nối UITableView delegatedatasourcevới bộ điều khiển của mình, bạn có thể làm điều gì đó như sau:

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

Nhanh

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
}

Bạn có chắc rằng nó thực sự được gọi nếu bạn thiết lập bảng phân cảnh bằng cách sử dụng các ô tĩnh? Tôi không có vẻ như nó đang được gọi.
lôi cuốn vào

7
Ah có vẻ như bạn phải triển khai numberOfSectionsInTableView:tableView:để có được nó.
lôi cuốn vào

Đối với các ô tĩnh, (hầu hết) tất cả các phương thức nguồn dữ liệu khác không được triển khai.
wcochran

2
Đã numberOfSectionsInTableView:tableView:triển khai @cedish trong IB cho các ô tĩnh.
wcochran

drawish là đúng - nếu bạn triển khai numberOfSectionsInTableView:, thì phương thức tiêu đề sẽ được gọi và ghi đè bảng phân cảnh. Do đây là một tableview tĩnh sau đó nó khá ok ghi đè bằng một phương pháp mà trả về một @wcochran hằng số
GreatWiz

16

Nếu bạn đang viết mã bằng Swift, nó sẽ giống như một ví dụ như thế này

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

Sử dụng phương thức UITableViewDataSource

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

5

titleForHeaderInSection là một phương thức ủy quyền của UITableView, do đó, để áp dụng văn bản tiêu đề của phần, hãy viết như sau,

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

3

Lưu ý rằng -(NSString *)tableView: titleForHeaderInSection:UITableView không được gọi nếu - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)sectionđược triển khai trong ủy quyền của UITableView;


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

văn bản nhãn phần được đặt.

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

Không có gì sai với các câu trả lời khác nhưng câu trả lời này cung cấp một giải pháp không lập trình có thể hữu ích trong các trường hợp có một bảng tĩnh nhỏ. Lợi ích là người ta có thể sắp xếp các bản địa hóa bằng cách sử dụng bảng phân cảnh. Người ta có thể tiếp tục xuất bản địa hóa từ Xcode qua các tệp XLIFF. Xcode 9 cũng có một số công cụ mới để giúp bản địa hóa dễ dàng hơn.

(nguyên)

Tôi đã có một yêu cầu tương tự. Tôi đã có một bảng tĩnh với các ô tĩnh trong Main.storyboard (Cơ sở) của mình. Để bản địa hóa tiêu đề phần bằng cách sử dụng tệp .string, ví dụ: Main.strings (tiếng Đức), chỉ cần chọn phần trong bảng phân cảnh và lưu ý ID đối tượng

ID đối tượng

Sau đó, chuyển đến tệp chuỗi của bạn, trong trường hợp của tôi là Main.strings (tiếng Đức) và chèn bản dịch như:

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

Tài nguyên bổ sung:


1

Tôi không biết về các phiên bản trước đây của UITableViewgiao thức, nhưng kể từ iOS 9, func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String?là một phần của UITableViewDataSourcegiao thức.

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

Bạn không cần phải khai báo delegateđể điền vào bảng của bạn với dữ liệu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.