Подробнее:

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

Ниже приведен контроллер вида (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()

    }
0
user11349745 3 Май 2019 в 06:31

6 ответов

Лучший ответ

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

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

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

UserDefaults.standard.string(forKey: “Your Key")
0
Muhammad Mohsin Ajmal 3 Май 2019 в 20:41

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

var theTitle:String?

И в вашем firstViewController используйте код ниже

let vc = MySecondViewController()
vc.theTitle = "\(navigationItem.title)"
self.navigationController?.pushViewController(vc, animated: true)
0
Paulw11 3 Май 2019 в 04:38

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

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

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

0
Nitish 3 Май 2019 в 04:55

В классе 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
Rahul Khatri 3 Май 2019 в 05:19

Если вы не хотите использовать 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
Marwen Doukh - Maruän Duch 3 Май 2019 в 14:17

Добавьте вычисляемое свойство в класс 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, необходимый для загрузки элементов с {{ X6}} свойство.

detailModel.downloadItems(customerLabel: selectedStock.titleStr)
0
Callam 4 Май 2019 в 10:28