2015-04-11 11 views
22

Tôi có hai mảng Data1 và Data2 và tôi muốn điền dữ liệu bên trong mỗi trong số này (chúng chứa chuỗi) vào một tableview trong hai phần khác nhau. Phần đầu tiên phải có tiêu đề "Một số dữ liệu 1" và phần thứ hai nên có tiêu đề "KickAss".Làm cách nào để điền hai phần trong một lần xem bảng với hai mảng khác nhau bằng cách sử dụng nhanh?

Tôi có cả hai phần điền dữ liệu từ mảng đầu tiên (nhưng không có tiêu đề nào).

Đây là mã của tôi cho đến nay:

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 2 
    } 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     var rowCount = 0 
     if section == 0 { 
      rowCount = Data1.count 
     } 
     if section == 1 { 
      rowCount = Data2.count 
     } 
     return rowCount 
    } 
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell 
     let ip = indexPath 
     cell.textLabel?.text = Data1[ip.row] as String 
     return cell 
    } 

trong phương pháp cellForRowAtIndexPath, là nó có thể cho tôi để xác định phần nào đó giống như tôi đã làm trong phương pháp numberOfRowsInSection? Ngoài ra, làm cách nào để cung cấp tiêu đề cho từng phần? Cảm ơn

+0

Tôi đã được tìm kiếm này cho một vài giờ và đây là điều duy nhất mà làm việc cho tôi. Cám ơn rất nhiều. –

Trả lời

12

Bạn có thể xác định phần nào của mình bằng cách xem indexPath.section. Để chỉ rõ tiêu đề, ghi đè lên các chức năng

func tableView(tableView: UITableView!, titleForHeaderInSection section: Int) -> String! 
+0

Cảm ơn tất cả các bạn. Đây là giải pháp nhanh chóng và dơ bẩn của tôi. – Woody

52

TableView tế bào

Bạn có thể sử dụng một mảng đa chiều. Ví dụ:

let data = [["0,0", "0,1", "0,2"], ["1,0", "1,1", "1,2"]] 

Đối với số phận sử dụng:

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return data.count 
} 

Sau đó, để xác định số lượng hàng trong từng bộ phận sử dụng:

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return data[section].count 
} 

Cuối cùng, bạn cần phải thiết lập các ô của bạn:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cellText = data[indexPath.section][indexPath.row] 

    // Now do whatever you were going to do with the title. 
} 

TableView Headers

Bạn lại có thể sử dụng một mảng, nhưng chỉ với một chiều thời gian này:

let headerTitles = ["Some Data 1", "KickAss"] 

Bây giờ để thiết lập các tiêu đề cho các phần:

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
    if section < headerTitles.count { 
     return headerTitles[section] 
    } 

    return nil 
} 

Đoạn mã trên sẽ kiểm tra để xem có một tiêu đề cho phần đó và trả về nó, nếu không thì nil sẽ được trả lại. Sẽ không có tiêu đề nếu số lượng tiêu đề trong số headerTitles nhỏ hơn số lượng mảng trong data.

Các Result

enter image description here

15

Bạn có thể tạo một Struct để giữ dữ liệu mà thuộc về một phần, như là một thay thế cho câu trả lời trước đây của tôi.Ví dụ:

struct SectionData { 
    let title: String 
    let data : [String] 

    var numberOfItems: Int { 
     return data.count 
    } 

    subscript(index: Int) -> String { 
     return data[index] 
    } 
} 

extension SectionData { 
    // Putting a new init method here means we can 
    // keep the original, memberwise initaliser. 
    init(title: String, data: String...) { 
     self.title = title 
     self.data = data 
    } 
} 

Bây giờ trong điều khiển điểm của bạn, bạn có thể thiết lập phần dữ liệu của bạn như sau:

lazy var mySections: [SectionData] = { 
    let section1 = SectionData(title: "Some Data 1", data: "0, 1", "0, 2", "0, 3") 
    let section2 = SectionData(title: "KickAss", data: "1, 0", "1, 1", "1, 2") 

    return [section1, section2] 
}() 

mục Headers

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return mySections.count 
} 

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
    return mySections[section].title 
} 

So với câu trả lời trước của tôi, bây giờ bạn không phải lo lắng về việc khớp số lượng headerTitles với số lượng mảng trong data.

TableView tế bào

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return mySections[section].numberOfItems 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cellTitle = mySections[indexPath.section][indexPath.row] 

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell 
    cell.textLabel?.text = cellTitle 

    return cell 
} 
+2

Tôi đã làm theo các bước này (iOS10, Swift 3) và nó hoạt động. Khá hữu ich. Cảm ơn! – Kai

+0

Giải pháp tuyệt vời! Sử dụng cấu trúc tốt hơn nhiều so với mảng 2D trong trường hợp này là – Imran

+0

Làm cách nào để áp dụng giải pháp này cho cùng một công trình nhưng với các tế bào động? Tôi có 4 mảng khác nhau mà cư trú hai phần kiểm soát bởi một điều khiển phân đoạn với hai phân đoạn. Vấn đề tôi đang đối mặt với bạn là giải pháp của tôi là các phần của tôi có các thành viên subscript noch, đó là cách tôi không thể điền vào các ô. – AlexVilla147

Các vấn đề liên quan