Как я могу передать имя ячейки таблицы в другой файл swift без использования сегментов? - PullRequest
0 голосов
/ 03 мая 2019

Подробнее:

Я хотел бы заменить customerLabel значением ячейки, выбранной в таблице, найденной в другом ViewController.

Далее следует View Controller (FeedDetail). Я бы хотел, чтобы значение пошло (заменив customerLabel)

class FeedDetail: UIViewController, URLSessionDataDelegate {


    weak var delegate: FeedDetailProtocol!

    func downloadItems() {
        let customerLabel = "CustomerName"
        var request = URLRequest(url: URL(string: "https://www.example.com/sample/sample.php")!)
        request.httpMethod = "POST"
        let postString = "a=\(customerLabel)"
        request.httpBody = postString.data(using: .utf8)

        let task = URLSession.shared.dataTask(with: request) { data, response, error in
            if let error = error {
                print("error=\(error)")
                return
            }

            print("response = \(response)")

            if let data = data, let responseString = String(data: data, encoding: .utf8) {
                print("responseString = \(responseString)")
                print(self.theTitle)
                self.parseJSON(data)
            }
        }
        task.resume()
    }

. Это таблица со значением, которым я хотел бы поделиться с первым контроллером.переменная titleStr - это то, что нужно передать FeedDetail.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    // Retrieve cell
    let cellIdentifier: String = "stockCell"
    let myCell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)!
    myCell.textLabel?.textAlignment = .center
    myCell.textLabel?.font = .boldSystemFont(ofSize: 18)
    // Get the stock to be shown
    let item: StockModel = feedItems[indexPath.row] as! StockModel
    // Configure our cell title made up of name and price


    let titleStr = [item.customer].compactMap { $0 }.joined(separator: "-")


    print(titleStr)
    // Get references to labels of cell
    myCell.textLabel!.text = titleStr

    return myCell
}

Обновление 2:

Этот ViewController (showCustomerDetails) - это то, чтооткрывается при выборе ячейки таблицы, данные поступают из FeedDetail (включая FeedDetailProtocol):

import UIKit

class showCustomerDetails: UIViewController, UITableViewDataSource, UITableViewDelegate, FeedDetailProtocol  {


    @IBOutlet weak var navButton: UIButton!

    var detectionString : String!
    var feedItems: NSArray = NSArray()
    var selectedStock : DetailModel = DetailModel()


    @IBOutlet weak var cancelButton: UIBarButtonItem!
    @IBOutlet weak var stockResultsFeed: UITableView!



    override func viewDidLoad() {
        super.viewDidLoad()


        let vc = FeedDetail()



        self.stockResultsFeed.delegate = self
        self.stockResultsFeed.dataSource = self

        let detailModel = FeedDetail()
        detailModel.delegate = self
        detailModel.downloadItems()

    }

Ответы [ 6 ]

0 голосов
/ 03 мая 2019

Помимо решений, представленных выше. Вы можете использовать UserDefaults. В вашем методе didSelectRowAt установите пользовательское значение по умолчанию, например

UserDefaults.standard.set("The title", forKey: "Your key")

Затем, когда вы захотите использовать заголовок, который вы выбрали ранее, в вашем следующем видеорегистраторе получите его, используя

UserDefaults.standard.string(forKey: “Your Key")
0 голосов
/ 03 мая 2019

Добавьте вычисляемое свойство к классу StockModel, который собирает titleStr.

extension StockModel {
    var titleStr: String {
        return [customer].compactMap({ $0 }).joined(separator: "-")
    }
}

. Вы можете использовать это при снятии очереди с ячейки:

myCell.textLabel!.text = item.titleStr

Внутри вашегоПервый контроллер представления, тот, который показывает табличное представление StockModel ячеек, вы можете подготовить целевой контроллер представления (showCustomerDetails), когда ячейка выбрана.Унаследованный метод, который мы переопределяем ниже, предоставляет вам segue (давая вам контроллер назначения) и отправителя segue.Ячейка прототипа в раскадровке соединена с контроллером showCustomerDetails, поэтому отправителем в этом сценарии будет выбран UITableViewCell.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    switch (segue.destination, sender) {
    case (let controller as showCustomerDetails, let cell as UITableViewCell):
        if let indexPath = tableView.indexPath(for: cell) {
            controller.selectedStock = feedItems[indexPath.row] as? StockModel
        }
    default:
        break
    }
}

В вашем контроллере вида showCustomerDetail япредположили, что свойство selectedStock должно быть StockModel, а не DetailModel.В этом случае вы можете использовать свойство customer selectedStock для загрузки элементов, относящихся к этому клиенту.

func downloadItems(customerLabel: String)

Выполните эту настройку для функции, чтобы можно было передать titleStr,В методе viewDidLoad showCustomerDetails, используя selectedStock, предполагая, что он имеет тип StockModel, вы можете получить customerLabel, необходимый для загрузки элементов со свойством titleStr.

detailModel.downloadItems(customerLabel: selectedStock.titleStr)
0 голосов
/ 03 мая 2019

Если вы не хотите использовать segue, вы можете использовать NotificationCenter, который вы можете использовать для отправки событий из вашей ячейки и списка в них во втором контроллере представления.

Уведомлениемеханизм рассылки, который позволяет передавать информацию зарегистрированным наблюдателям.

Чтобы отправлять события, добавьте это в ваш cellForRowAt:

NotificationCenter.default.post(name: Notification.Name("YOURKEY"), object: nil, userInfo: ["titleKey": titleStr])

Затем вы должны подписаться на это событиедобавление слушателя в вашем втором контроллере представления (событие будет передаваться ячейкой в ​​вашем случае):

NotificationCenter.default.addObserver(self, selector: #selector(self.myFunc(notification:)), name: Notification.Name("YOURKEY"), object: nil)

Затем добавьте функцию, которая будет выполняться при получении события (из вашей ячейки):

 @objc func myFunc(notification: Notification) {

        guard let data = notification.userInfo as? [String: String] else {
            return
        }
        debugPrint("my title \(data["titleKey"])")

    }
0 голосов
/ 03 мая 2019

В классе FeedDetail создайте строковую переменную

var strTitle = ""

В методе didSelectRowAtIndexPath первого viewcontroller напишите этот код

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let vc = FeedDetail()..let item: StockModel = feedItems[indexPath.row] as! StockModel
    let titleStr = [item.customer].compactMap { $0 }.joined(separator: "-")
    vc.strTitle = titleStr
    self.navigationController?.pushViewController(vc, animated: true)
}
0 голосов
/ 03 мая 2019

Используйте title свойство UIViewController

let vc = ViewController1()
vc.title = "Test"
self.navigationController?.pushViewController(vc, animated: true)  

Test будет отображаться в заголовке ViewController1.
Если вы говорите, что не хотите, чтобы второй ViewController выдвигался, это невозможно, если вы не берете 1) переменную приложения. Или то, что вы можете сделать, это позвонить в первые две строки, а затем вызвать третью строку, когда вам это нужно. Но не переинициализируйте ViewController1, иначе заголовок будет потерян.

0 голосов
/ 03 мая 2019

Создайте переменную theTitle в вашем втором ViewController

var theTitle:String?

и в вашем первом ViewController используйте следующий код

let vc = MySecondViewController()
vc.theTitle = "\(navigationItem.title)"
self.navigationController?.pushViewController(vc, animated: true)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...