2015-08-04 16 views
10

Tôi đang cố gắng mở rộng ô xem bảng khi khai thác. Sau đó, khi nó được khai thác một lần nữa, tôi muốn nó quay trở lại trạng thái ban đầu của nó.Mở rộng và hợp đồng ô xem bảng khi khai thác, nhanh chóng

Nếu cellA được mở rộng và cellB được khai thác, tôi muốn cellA hợp đồng và cellB mở rộng cùng một lúc. Vì vậy, chỉ có một ô có thể ở trạng thái mở rộng của nó trong bất kỳ thời điểm nào.

mã hiện tại của tôi:

class MasterViewController: UITableViewController { 
    var isCellTapped = false 
    var currentRow = -1 


    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     selectedRowIndex = indexPath 
     tableView.beginUpdates() 
     tableView.endUpdates() 
    } 


    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 

    if indexPath.row == selectedRowIndex.row { 
     if isCellTapped == false { 
      isCellTapped = true 
      return 140 
     } else if isCellTapped == true { 
      isCellTapped = false 
      return 70 
     } 

    } 

    return 70 
} 

mã hiện tại hoạt động tốt khi:

  • Bạn gõ liên tiếp (nó mở rộng)
  • Bạn khai thác nó một lần nữa (nó hợp đồng)

Không thành công khi:

  • Bạn gõ liên tiếp (nó mở rộng)
  • Bạn gõ một hàng (hợp đồng đó, nhưng hàng khác không mở rộng)

Làm thế nào tôi có thể giải quyết này?

+0

Những gì bạn đang cố gắng đạt được? Một menu accordion (trình đơn thả xuống) sử dụng một 'UITableView'? –

+0

Có @VictorSigler, một cái gì đó như thế. Bạn có nghĩ rằng trong có thể được thực hiện bằng cách sử dụng UITableView? Hoặc có bất kỳ lớp nào khác phù hợp hơn với nhiệm vụ không? –

+0

Có, bạn có thể @Diego xem câu trả lời của tôi. –

Trả lời

17

Bạn cần phải thực hiện trong tài khoản mà bạn cần phải cập nhật hàng đã chọn của bạn khi khác được khai thác, xem đoạn mã sau:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 

    if indexPath.row == selectedRowIndex { 
     return 140 
    } 
    return 44 
} 

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    if selectedRowIndex != indexPath.row { 

     // paint the last cell tapped to white again 
     self.tableView.cellForRowAtIndexPath(NSIndexPath(forRow: self.selectedRowIndex, inSection: 0))?.backgroundColor = UIColor.whiteColor() 

     // save the selected index 
     self.selectedRowIndex = indexPath.row 

     // paint the selected cell to gray 
     self.tableView.cellForRowAtIndexPath(indexPath)?.backgroundColor = UIColor.grayColor() 

     // update the height for all the cells 
     self.tableView.beginUpdates() 
     self.tableView.endUpdates() 
    } 
} 

EDIT:

Để xử lý mà ô được chọn và được nhấn lại trở về trạng thái ban đầu, bạn cần kiểm tra một số điều kiện như sau:

var thereIsCellTapped = false 
var selectedRowIndex = -1 

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 

    if indexPath.row == selectedRowIndex && thereIsCellTapped { 
     return 140 
    } 

    return 44 
} 

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    self.tableView.cellForRowAtIndexPath(indexPath)?.backgroundColor = UIColor.grayColor() 

    // avoid paint the cell is the index is outside the bounds 
    if self.selectedRowIndex != -1 { 
     self.tableView.cellForRowAtIndexPath(NSIndexPath(forRow: self.selectedRowIndex, inSection: 0))?.backgroundColor = UIColor.whiteColor() 
    } 

    if selectedRowIndex != indexPath.row { 
     self.thereIsCellTapped = true 
     self.selectedRowIndex = indexPath.row 
    } 
    else { 
     // there is no cell selected anymore 
     self.thereIsCellTapped = false 
     self.selectedRowIndex = -1 
    } 

    self.tableView.beginUpdates() 
    self.tableView.endUpdates() 
} 

Với các sửa đổi ở trên trong các chức năng didSelectRowAtIndexPathheightForRowAtIndexPath bạn có thể thấy khi một ô được nhấn vào màu nền, nó sẽ được thay đổi thành màu xám khi chiều cao tăng và khi ô khác được nhấn vào ô được tô màu trắng và nhấn để màu xám và một lần nữa và một lần nữa cho phép chỉ chạm vào một tế bào tại thời điểm.

tôi mặc dù bạn có thể mang lại lợi ích và học hỏi làm thế nào để làm một Menu Accordion trong repo này tôi đã tạo ra và tôi có kế hoạch để cập nhật rất sớm để xử lý kết quả tốt hơn, đó là xử lý bằng cách sử dụng UITableView giống như bạn muốn.

Bất kỳ nghi ngờ nào trong kho lưu trữ mà bạn có thể đăng ở đây.

Tôi hy vọng điều này sẽ giúp bạn.

+0

Tôi nhận được hai lỗi với mã của bạn: "NSIndexPath không chuyển đổi thành int" và "không thể gán giá trị của Int cho một giá trị kiểu NSIndexPath". Điều này xảy ra khi cố gắng "vẽ ô được nhấn vào màu trắng một lần nữa" và sau đó khi "lưu chỉ mục đã chọn". Bất kỳ đầu mối? –

+0

Tôi đã giải quyết hai vấn đề đó, chỉ là một lỗi nghiêm trọng về phía tôi. Vấn đề của tôi là bây giờ. Mã của bạn hoạt động tốt ngay bây giờ, nhưng khi khai thác một ô đã được mở rộng, ô sẽ không trở lại trạng thái ban đầu (đã ký hợp đồng) của nó. –

+0

@DiegoPetrucci Xem câu trả lời cập nhật của tôi để làm rõ những nghi ngờ của bạn. –

3

Một phương pháp đơn giản để mở rộng chỉ có một tế bào tại một thời điểm:

Swift 3

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource { 

var selectedRowIndex = -1 
@IBOutlet weak var tableView: UITableView! 

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
     if indexPath.row == selectedRowIndex { 
      return 90 //Expanded 
     } 
     return 40 //Not expanded 
    } 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     if selectedRowIndex == indexPath.row { 
      selectedRowIndex = -1 
     } else { 
      selectedRowIndex = indexPath.row 
     } 
     tableView.reloadRows(at: [indexPath], with: .automatic) 
    } 
} 

Mã này sẽ mở rộng các tế bào nhấp và tế bào gần được mở trước đó với hình ảnh động.

+0

Cảm ơn nó hoạt động rất tốt, khi tôi cố gắng đặt một điểm ngắt trong câu lệnh "return 90 // Expanded" nó được thực hiện là 3 lần, bạn có thể cho tôi biết tại sao không? –

+0

Chiều cao cho hàng thực hiện cho mỗi hàng trong bảng –

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