Вы неправильно поняли цель делегирования здесь. Идея состоит в том, что ваше табличное представление отвечает только за рисование таблицы, но не должно поддерживать какие-либо данные, которые оно отображает. Это позволяет аккуратно спроектировать ваш код с использованием парадигмы Model-View-Controller (MVC). Делегирование позволяет вашим контроллерам передавать информацию о модели в представления, не нарушая MVC.
В вашем примере: Address
- это модель, табличное представление - это представление, а контроллер представления - это контроллер. Таким образом, вы хотите, чтобы ваш контроллер соответствовал протоколам делегата / источника данных табличного представления, чтобы он мог корректно передавать данные в него.
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
var contactArray = [Address]()
@IBOutlet weak var userTable: UserTable!
override func viewDidLoad() {
super.viewDidLoad()
if Connectivity.isConnectedToInternet() {
print("Yes! Network connection is available")
APIManager.sharedInstance.fetchUserDetails(urlString: FETCH_USER_DETAIL_URL, userCount: ["offset":1]) { connectionResult in
switch connectionResult {
case .success(let data):
do {
self.contactArray = try JSONDecoder().decode([Address].self, from: data)
print(self.contactArray.count)
print(self.contactArray[0].Name)
DispatchQueue.main.async {
print(self.contactArray)
self.userTable.reloadData()
}
}
catch let errorValue {
print(errorValue)
}
case .failure(let error):
print(error)
}
}
}
else{
print("No network connection")
}
}
// MARK: - UITableViewDataSource
func numberOfSections(in tableView: UITableView) -> Int {
return 1;
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.contactArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell: UserCell = tableView.dequeueReusableCell(withIdentifier: "UserCell", for: indexPath) as! UserCell
let myUser = self.contactArray[indexPath.row]
cell.nameLbl.text = myUser.Name
cell.emailLbl.text = myUser.Email
cell.phoneLbl.text = myUser.Phone
return cell
}
// MARK: - UITableViewDelegate
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 200
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let myUser = self.contactArray[indexPath.row]
print(myUser.Name)
print(myUser.Email)
print(myUser.Phone)
selectedUserContact(name: myUser.Name, email: myUser.Email, phone: myUser.Phone)
}
// MARK: -
func selectedUserContact(name: String, email: String, phone: String) {
print("Delegate Called")
let userdetailVC = storyboard?.instantiateViewController(withIdentifier: "UserContactDetailPage") as! UserContactDetailPage
userdetailVC.name = name
userdetailVC.email = email
userdetailVC.phone = phone
self.navigationController?.pushViewController(userdetailVC, animated: true)
}
}
РЕДАКТИРОВАТЬ: Я просто хочу добавить, что вы должны убедиться, что в вашей раскадровке вы установили ViewController
в качестве delegate
и dataSource
представления таблицы. Затем вы можете удалить весь код, который вы написали в классе UserTable
. Если вам что-то вообще не нужно, и ваш табличный вид может быть простым UITableView
. Я почти никогда не создаю его подклассы, так как обычно вы можете делать все через делегирование и UITableViewCell
подклассы.