Проблема с переходом из ячеек TableView в отдельный ViewController

tableviewcontroller
uitextview
swift
uitableview

#1

Здравствуйте дорогие друзья! С недавних пор я начал заниматься изучением swift, чтобы научиться разрабатывать приложения. В данный момент я делаю приложение на подобие TO DO List(ежедневник), где можно добавлять и удалять разные дела, которые пользователь планирует выполнять в течение дня. Так вот, в связи с этим, у меня возникла следующая трудность. Дело в том, что мне нужно сделать так, чтобы при нажатии на кнопку в (UITableView -> cell) пользователь попадал в следующий ViewController(страницу), в котором находится TextView, где можно добавить дополнительную запись или проще говоря текст, который бы сохранялся при следующей загрузке приложения. У меня все работает за исключением того, что текст все время сохраняется и показывается один и тот же для всех CELL, а нужно чтобы для каждого cell (элемента в таблице UITableView) открывался отдельный ViewController либо так, чтобы загружался отдельный текст. Таблица динамическая (расширяющаяся), то есть пользователь может в любой момент добавить, удалить либо поменять местами разные элементы(строки), поэтому он состоит из массива(Dictionary) типа String: Any. Возможно нужно создать отдельный массив только уже для текста из TextView и каким-то образом синхронизировать их между собой. Ниже я приложу несколько скринов приложения, чтобы было лучше представление о том, что я имею ввиду. Буду признателен за любую помощь либо совет! Спасибо.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////

а также здесь ссылка на видео
https://drive.google.com/drive/folders/17JYRMCy_8CZ_M4R9D_0G5s5-MY_IOzEk?usp=sharing


#2

Воспользуйтесь функцией:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    performSegue(withIdentifier: "здесь идентификатор вашего контроллера", sender: tableView.cellForRow(at: indexPath))
}

Всё, что вам нужно, это открыть в новом контроллере ячейку с привязкой к indexPath. Именно indexPath говорит, что именно должно открыться)


#3

Ну блин, тут же базовый курс лежит. И даже если поищешь в инете, то каждый второй туториал для новичков связан с таблицами и переходами.

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

Ну и в пером экране реализуй метод prepeareForSegue.
Внутри делай кастинг:

if let vc = segue.destination as? КлассВторогоКонтроллера {
//    передаем модель в контроллер vc
}

#4

Спасибо, я попробую! :slightly_smiling_face::+1:


#5

Спасибо за ответ, я понимаю, как делать переход из tableview в Textviewcontroller. Но проблема то заключается в том, что мне нужно сделать, так чтобы каждый раз при нажатии на разные ячейки в TextViewController отображался текст, который привязан к данному индексу.
TableViewController - (TableView cell(index: 0 )) -> TextViewController - (TextView (для index: 0))
TableViewController - (TableView cell(index: 1 )) -> TextViewController - (TextView (для index: 1))
TableViewController - (TableView cell(index: 2 )) -> TextViewController - (TextView (для index: 2))
TableViewController - (TableView cell(index: 3 )) -> TextViewController - (TextView (для index: 3))
и т. д.
а у меня в данный момент получается так, что текст для всех ячеек открывается одинаковый. Поэтому я и подумал, что может быть нужно добавить текст в новую переменную массива. Ну или как-то так. Возможно что я ошибаюсь.


#6

Нет, ты не понимаешь как делать переход, раз такие вопросы возникают. :slight_smile:
Либо вопрос сформулировал непонятным образом.

Не важно что тебе надо передать. Ты это определяешь по нажатию на кнопку, ячейку, какой-то иной элемент контроллера “А”, затем при подготовке перехода prepeareForSegue ты передаешь в другой контроллер нужные данные. Все.

А второй контроллер получив эти данные что-то с ними делает. ОТображает, в консоль выводит или просто игнорит.


#7

да я новичок в этом деле. Можно сказать, что это мое первое приложение :sweat_smile: Так что извиняй) Да скорее всего я немного неправильно сформулировал вопрос. Просто если я правильно тебя понял, то мы можем передать любую информацию из первого, то есть главного ViewControllerа в следующий контроллер. А как тогда передать сохраненный текст из второго котроллера в первый, таким же образом, то есть с помощью функции prepareForSeque :smile: Или же будет лучше если я передам текст в массив для ячеек таблицы, чтобы он сохранялся по index для каждой строки? :exploding_head:
В общем ладно, в любом случае спасибо, попробую разобраться с переходами. Ну а если не получится, тогда придется спросить у учителя ))


#8

Ну короче это стандартная: передать данные во второй контроллер, вернуть данные обратно.
Реализовать это можно кучей способов. Самое простое - делегирование.

В примере я явно создаю контроллер, явно вызываю у него viewDidload итп


class A {
	var foo: String = "foo"
	
	func prepeare(segue: String) {
//		if let vc = segue.destination as? B {
//			vc.model = foo
//		}
		let vc = B()
		vc.model = foo
		vc.completionHandler = { [weak self] (model) in
			self?.configure(model: model)
		}
		vc.viewDidLoad()
	}
	
	func configure(model: String) {
		print("show up \(model)")
	}
}

class B {
	var completionHandler: ((String) -> ())?
	var model: String = ""
	
	func viewDidLoad() {
		print("do something with code")
		completionHandler?("\(model)...updated!")
	}
}

let a = A()
a.prepeare(segue: "")

Это делегат через замыкание. Можно через протоколы делегата сделать. Ну и еще парой способов, которые надо опробовать.


#9

Спасибо! Я попробую данный метод. :+1: Андрей, а можно с вами как то связаться, например по скапйпу, чтобы спросить поподробнее о том как можно решить эту проблему. Я могу также показать вам свой код, если вас это конечно не затруднит! ) Просто на данный момент, у меня к сожалению нет знакомых программистов, которые бы разбирались в теме ios swift.


#10

Не, я много денег прошу за такие консультации. :slight_smile: Хотя и могу доступно объяснить что и как там работает. :)))

Лучше тебе освоить гит (часто тут дублирую сервис https://learngitbranching.js.org) и выкладывать проекты на гитхаб. Тогда я (и может не только я) смогу глянуть и правки внести или код заревьювить.


#11

Ну это в принципе понятно, что сейчас за бесплатно ничего не бывает)) Просто мне нужно срочно доделать этот учебный проект в течении двух недель, а я только недавно начал изучать swift. Так что я в принципе готов обсудить цену.
Как с вами лучше связаться, может по мэйлу ?) А то я уже всю голову сломал…