2017-02-20 42 views
1

我無法在另一個控制器的for循環內以編程方式創建視圖。父控制器是一個tableviewcell,我正在通過一個CNContact對象中的一堆電話號碼循環。對於每個聯繫人的電話號碼,我希望創建自定義視圖並將其添加到tableviewcell並使其垂直堆疊。通過電話號碼循環,創建自定義視圖並將其傳遞給電話號碼

到目前爲止,我設法創建視圖並將其添加到tableviewcell中,但無法傳遞數據。這是將數據從一個控制器傳遞到另一個控制器,我正在努力。

這裏是我的代碼:

ContactListTableViewCell.swift

import UIKit 
import Contacts 

class ContactListTableViewCell: UITableViewCell { 

    @IBOutlet weak var titleLabel: UILabel! 
    @IBOutlet weak var phonenumberView: UIView! 

    func configureCell(contact: CNContact) { 
     titleLabel.text = "\(contact.givenName) \(contact.familyName)" 

     for phoneNumber in contact.phoneNumbers { 

      let view = self.createContactListTableViewTelephoneRow(telephone: phoneNumber) 
      self.phonenumberView.addSubview(view) 


     } 


    } 

    func createContactListTableViewTelephoneRow(telephone: Any) -> UIView { 
     let controller = ContactListTableViewTelephoneRow() 
     let view = UINib(nibName: "ContactListTableViewTelephoneRow", bundle: nil).instantiate(withOwner: controller, options: nil)[0] as! UIView 
     return view 
    } 

} 

contactListTableViewCell原型內Main.storyboard enter image description here

ContactListTableViewTelephoneRow.swift

class ContactListTableViewTelephoneRow: UIView { 

    @IBOutlet var view: UIView! 
    @IBOutlet weak var telephoneLabel: UILabel! 
    @IBOutlet weak var telephoneTypeLabel: UILabel! 

    func setData(telephoneLabelText: String, telephoneTypeLabelText: String) { 
     telephoneLabel?.text = telephoneLabelText 
     telephoneTypeLabel?.text = telephoneTypeLabelText 
    } 


} 

CONTA ctListTableViewTelephoneRow.xib

enter image description here

任何幫助將非常感激。謝謝。

+0

你能告訴我你是如何發送數據。 – Prabhat

回答

0

傳遞數據的簡單方法是,你需要箱子對象在你的第二個控制器和第一控制器通過數據

let vc = self.storyboard!.instantiateViewController(withIdentifier: "Secondcontroller") as! Secondcontroller 
    vc.yourObject = object //To pass 
    self.present(tabvc, animated: true, completion: nil) // or push 
0

您將需要直接投你創建使用UNib.[...]視圖並將數據傳遞給它:

func createContactListTableViewTelephoneRow(telephone: CNLabeledValue<CNPhoneNumber>) -> UIView { 
    let nib = UINib(nibName: "ContactListTableViewTelephoneRow", bundle: nil) 
    let root = nib.instantiate(withOwner: nil, options: nil)[0] 
    let view = root as! ContactListTableViewTelephoneRow 

    view.setData(telephoneLabelText: telephone.value.stringValue, 
       telephoneTypeLabelText: telephone.label!) // make sure `telephone.label!` is correct – I never compiled it 

    return view 
} 

請注意,我調整了createContactListTableViewTelephoneRow(telephone:)的簽名。

但作爲一個整體建議:我會以一種非常不同的方式解決您的用戶界面問題。

背景:UITableView嚴重重複使用(隊列/出隊)單元,以便滾動性能可以接受。儘管我假設您使用UITableViewDataSource的API正確加載您的單元格內的筆尖可能會非常快地成爲性能瓶頸。

我建議不要在您的手機中設置ContactListTableViewTelephoneRow。相反,它也是UITableViewCell的子類。在這種情況下,您的視圖控制器當然必須處理至少兩種不同類型的單元格。您可以使用不同的部分來保持邏輯非常簡單。這裏是一個完整的例子:(你當然需要調整造型)

import Contacts 
import UIKit 

class ContactListTelephoneTableViewCell: UITableViewCell { 

    @IBOutlet weak var telephoneLabel: UILabel! 
    @IBOutlet weak var telephoneTypeLabel: UILabel! 

    func configureCell(telephone: CNLabeledValue<CNPhoneNumber>) { 
     telephoneLabel.text = telephone.value.stringValue 
     telephoneTypeLabel.text = telephone.label! 
    } 
} 

class ContactListTableViewCell: UITableViewCell { 

    @IBOutlet weak var titleLabel: UILabel! 

    func configureCell(contact: CNContact) { 
     titleLabel.text = "\(contact.givenName) \(contact.familyName)" 
    } 
} 


class DataSource: NSObject, UITableViewDataSource { 

    var contacts: [CNContact]! 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return contacts[section].phoneNumbers.count + 1 // one extra for given and family name 
    } 

     func numberOfSections(in tableView: UITableView) -> Int { 
     return contacts.count 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     if indexPath.row == 0 { 
      return self.tableView(tableView, nameCellForRowAt: indexPath) 
     } else { 
      return self.tableView(tableView, phoneCellForRowAt: indexPath) 
     } 
    } 

    func tableView(_ tableView: UITableView, nameCellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "name", for: indexPath) as! ContactListTableViewCell 
     cell.configureCell(contact: contacts[indexPath.section]) 
     return cell 
    } 

    func tableView(_ tableView: UITableView, phoneCellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "phone", for: indexPath) as! ContactListTelephoneTableViewCell 

     let contact = contacts[indexPath.section] 
     let telephone = contact.phoneNumbers[indexPath.row - 1] // minus one for given and family name 
     cell.configureCell(telephone: telephone) 

     return cell 
    } 
}