วิธีตั้งชื่อส่วน UITableView โดยทางโปรแกรม (iPhone / iPad)


106

ฉันได้สร้างUITableViewในตัวสร้างอินเทอร์เฟซโดยใช้storyboards. UITableViewคือการติดตั้งที่มีstatic cellsเป็นจำนวนมากและส่วนที่แตกต่างกัน

ปัญหาที่ฉันพบคือฉันพยายามตั้งค่าแอปในภาษาต่างๆ ในการทำเช่นนี้ฉันต้องสามารถเปลี่ยนUITableViewชื่อส่วนได้

ใครก็ได้ช่วยฉันทีได้ไหม ตามหลักการแล้วฉันต้องการแก้ไขปัญหาโดยใช้IBOutletsแต่ฉันสงสัยว่าจะไม่สามารถทำได้ในกรณีนี้ คำแนะนำและข้อเสนอแนะใด ๆ จะได้รับการชื่นชมมาก

ขอบคุณล่วงหน้า.

คำตอบ:


280

เมื่อคุณเชื่อมต่อ UITableView delegateและdatasourceคอนโทรลเลอร์ของคุณแล้วคุณสามารถทำสิ่งนี้ได้:

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

รวดเร็ว

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
}

คุณแน่ใจว่าจะถูกเรียกจริงๆหากคุณตั้งค่ากระดานเรื่องราวโดยใช้เซลล์แบบคงที่? ดูเหมือนจะไม่ถูกเรียกใช้
วาด

7
ดูเหมือนว่าคุณต้องใช้numberOfSectionsInTableView:tableView:เพื่อให้มันถูกเรียก
วาด

สำหรับเซลล์แบบคงที่ (ส่วนใหญ่) จะไม่มีการใช้วิธีการแหล่งข้อมูลอื่น ๆ ทั้งหมด
wcochran

2
@drewish numberOfSectionsInTableView:tableView:ใช้งานใน IB สำหรับเซลล์แบบคงที่
wcochran

drewish ถูกต้อง - หากคุณใช้งานnumberOfSectionsInTableView:ระบบจะเรียกใช้เมธอดชื่อเรื่องและทับกระดานเรื่องราว เนื่องจากนี่เป็นมุมมองตารางแบบคงที่ดังนั้นจึงค่อนข้างโอเคที่จะแทนที่ด้วยวิธีการที่ส่งกลับค่าคงที่ @wcochran
GreatWiz

16

หากคุณกำลังเขียนโค้ดใน Swift จะมีลักษณะเป็นตัวอย่างเช่นนี้

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


5

titleForHeaderInSectionเป็นวิธีการมอบหมายของ UITableViewเพื่อใช้ข้อความส่วนหัวของส่วนเขียนดังนี้

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

3

โปรดทราบว่า-(NSString *)tableView: titleForHeaderInSection:UITableView จะไม่ถูกเรียกหาก- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)sectionถูกนำไปใช้ใน delegate ของ UITableView


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

มีการตั้งค่าข้อความป้ายกำกับส่วน

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

ไม่มีอะไรผิดกับคำตอบอื่น ๆ แต่คำตอบนี้นำเสนอโซลูชันที่ไม่ใช่โปรแกรมซึ่งอาจมีประโยชน์ในสถานการณ์ที่มีตารางคงที่ขนาดเล็ก ข้อดีคือสามารถจัดระเบียบการแปลโดยใช้สตอรี่บอร์ด ระบบอาจส่งออกการแปลจาก Xcode ผ่านไฟล์ XLIFF ต่อไป Xcode 9 ยังมีเครื่องมือใหม่ ๆ เพื่อให้การแปลภาษาง่ายขึ้น

(ต้นฉบับ)

ฉันมีข้อกำหนดที่คล้ายกัน ฉันมีตารางคงที่ที่มีเซลล์แบบคงที่ใน Main.storyboard (Base) ของฉัน ในการแปลชื่อส่วนโดยใช้ไฟล์. สตริงเช่น Main.strings (ภาษาเยอรมัน) เพียงแค่เลือกส่วนในกระดานเรื่องราวและจดรหัสวัตถุ

รหัสวัตถุ

จากนั้นไปที่ไฟล์สตริงของคุณในกรณีของฉัน Main.strings (ภาษาเยอรมัน) และแทรกคำแปลเช่น:

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

แหล่งข้อมูลเพิ่มเติม:


1

ฉันไม่รู้เกี่ยวกับUITableViewโปรโตคอลเวอร์ชันที่ผ่านมาแต่สำหรับ iOS 9 func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String?เป็นส่วนหนึ่งของ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"
      }
   }

คุณไม่จำเป็นต้องประกาศว่าdelegateจะเติมข้อมูลในตารางของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.