Доступ к информации ячейки табличного представления из другого контроллера представления в Swift - PullRequest
0 голосов
/ 12 мая 2018

Мы разрабатываем приложение, и у нас есть один контроллер табличного представления и один контроллер представления. В моем контроллере представления вкладок он имеет кнопки в каждой ячейке, и мы перетаскиваем его, чтобы установить соединение с ячейкой контроллера представления. Если мы нажимали кнопки в разных ячейках, мы хотим обновить данные в нашем контроллере представления из coredata (каждая кнопка обращается к разной информации о человеке) Но проблема в том, что мы не можем получить доступ к информации о ячейке из класса контроллера представления. Мы нашли здесь несколько примеров, но не смогли этого сделать.

     //table view controller class
            var charArray = ["a","b","c"]
             override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                    let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath)
                    let myCharacter = charArray[indexPath.row]
                    cell.textLabel?.font = UIFont(name: "HoeflerText-Italic", size: 27.0)
                    cell.textLabel?.text = myCharacter

                    return cell
                }


        //view controller class
         override func viewDidLoad() {
                super.viewDidLoad()
                charText.isEditable = false
                guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
                    return
                }
                let managedContext = appDelegate.persistentContainer.viewContext// This one is created to work with Managed Object
                let entity = NSEntityDescription.entity(forEntityName: "CHARACTER",in: managedContext)!


            if let a = CI.tableView.cellForRow(at: IndexPath.init(row: i, section: i)),a.textLabel?.text == "Iron Man"{
                    imageChar.image =  UIImage(named: "Iron_Man")
                    btn1.setTitle("Iron Man ", for: .normal)
                    btn1.showsTouchWhenHighlighted = true
                    btn2.setTitle("Iron Man 2", for: .normal)
                    btn2.showsTouchWhenHighlighted = true
                    btn3.setTitle("Iron Man 3", for: .normal)
                    btn3.showsTouchWhenHighlighted = true

                let person = NSManagedObject(entity: entity,insertInto: managedContext)
                        person.setValue(CHS[0].species , forKeyPath: "species")
                        person.setValue(CHS[0].name , forKeyPath: "title")
                        person.setValue(CHS[0].gender, forKeyPath: "gender")
                        person.setValue(CHS[0].textInfo, forKey: "information")
                        person.setValue(CHS[0].age, forKey: "age")

                        do {// Save into our app's dedicated disk area
                            try managedContext.save()
                            people.append(person)
                        } catch let error as NSError {
                            print("Could not save. \(error), \(error.userInfo)")
                        }

              //  print(people.first as Any)

                        let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "CHARACTER")
                        do{
                            let request = try managedContext.fetch(fetchRequest)


                            for data in request{
                                labelName.text = data.value(forKey: "title") as? String
                                labelSpecies.text = data.value(forKey: "species") as? String
                                labelGender.text = data.value(forKey: "gender") as? String
                                charText.text = data.value(forKey: "information") as? String
                                labelAge.text = data.value(forKey: "age") as? String
                            }
                        }
                        catch let error as NSError {
                            print("Could not fetch. \(error), \(error.userInfo)")
                        }
                }



//Another option --------
        override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

                let StoryBoard = UIStoryboard(name: "Main", bundle: nil)
                let CIVC = StoryBoard.instantiateViewController(withIdentifier: "CharacterInformationViewController") as! CharacterInformationViewController

                guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
                    return
                }
                let managedContext = appDelegate.persistentContainer.viewContext// This one is created to work with Managed Object
                let entity = NSEntityDescription.entity(forEntityName: "CHARACTER",in: managedContext)!
                let person = NSManagedObject(entity: entity,insertInto: managedContext)
                person.setValue(CHS[indexPath.row].species , forKeyPath: "species")
                person.setValue(CHS[indexPath.row].name , forKeyPath: "title")
                person.setValue(CHS[indexPath.row].gender, forKeyPath: "gender")
                person.setValue(CHS[indexPath.row].textInfo, forKey: "information")
                person.setValue(CHS[indexPath.row].age, forKey: "age")

                do {// Save into our app's dedicated disk area
                    try managedContext.save()

                    people.append(person)
                    print(person)
                } catch let error as NSError {
                    print("Could not save. \(error), \(error.userInfo)")
                }



                let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "CHARACTER")
                do{
                    let request = try managedContext.fetch(fetchRequest)

                    //Try to get data from table view controller class and make an object of my view controller class
                    for data in request{
                        CIVC.getName = (data.value(forKey: "title") as? String)!
                        CIVC.getSpecies = (data.value(forKey: "species") as? String)!
                        CIVC.getGender = (data.value(forKey: "gender") as? String)!
                        CIVC.getText = (data.value(forKey: "information") as? String)!
                        CIVC.getAge = (data.value(forKey: "age") as? String)!
                    }
                }
                catch let error as NSError {
                    print("Could not fetch. \(error), \(error.userInfo)")
                }


            }

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Если ваш набор данных не меняется, то есть вы не удаляете строки, общий подход к этой проблеме - использовать свойство tag каждой кнопки внутри ячейки.Вы можете установить тег следующим образом:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath)
            let myCharacter = charArray[indexPath.row]
            cell.textLabel?.font = UIFont(name: "HoeflerText-Italic", size: 27.0)
            cell.textLabel?.text = myCharacter

            cell.btn1.tag = indexPath.row // set tag

            return cell
        }

И затем использовать это свойство тега в качестве индекса для своего источника данных:

@objc func didTapButton(sender: UIButton) {
    let cellIndex = sender.tag
    let info = charArray[cellIndex]
    // do something with info
}

Другой подход заключается в созданииделегировать внутри пользовательского UITableViewCell и устанавливать его при удалении из очереди каждой ячейки.

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    // ...
    cell.delegate = self;
    // ...
  }

При каждом нажатии кнопки внутри ячейки вызывайте метод (который вы определяете в протоколе) вэто делегат (UIViewController).Метод может содержать все, что вы хотите, включая идентифицируемые данные.Убедитесь, что UIViewController соответствует этому протоколу.

0 голосов
/ 13 мая 2018

Вам не хватает метода didSelectRowAtIndexPath.

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath) {

}

https://developer.apple.com/documentation/uikit/uitableviewdelegate/1614877-tableview?language=objc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...