22:00 ❗❗❗ !textLabel is depricated now! for changing of content image or text - use this construction in method ....cellForRowAt: let cell = table.view.dequeueReusableCell(withIdentifier: identifire, for indexPath) var contentCell = cell.defaultContentConfiguration() contentCell.text "...(your text)" cell.contentConfiguration = contentCell return cell 😉
черт, актуально до сих пор. вот сижу постигаю, действительно важные темы, которые мне помогли затащить задание на курсах и вообще видос помог разобраться. От души!!!
43:20 для того, чтобы появился значок удаления нужно добавит функцию func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { true }
Евгений спасибо большое, что объясняете базовые темы. Я вот только сейчас понял для чего Data Source и Delegate остальные просто показывают, но ничего про это не говорят. Я как обезьянка повторяю за их уроком, но не понимаю для чего я это делаю. А так сразу все на свои места встает после таких видео!
Вот этого урока не хватало! Кое-что никогда не использовал. Тема не простая, есть свои подводные камни. По поводу статической таблицы и ViewController-а (2:28). Их можно использовать вместе! для этого нужно кинуть на контроллер Container View, а потом вписать в него TableViewController со статической таблицей и это очень удобно, особенно когда нужно сделать сложный интерфейс в контроллере, т.к. с TableViewController-ом работать в этом плане очень сложно.
Женя, Вы гений! Вы просто гениально растолковываете людям знания, которые другие ораторы описывают так, что фокусы Копперфильда могут показаться проще, чем взаимодействие внутри MVC. Огромное Вам человеческое спасибо за столь ВАЖНЫЙ для каждого начинающего программиста рассказ. Изучаю SWIFT 9 месяцев, пока это видео не посмотрел, так и не понимал про взаимодействие. О том, что DataSourсe передает данные понятно, а вот как обратно (ответ: Как-то передает, фиг знает как.). В копилку взаимопомощи (товарищ тут раньше спрашивал про тонкости с подгрузкой данных из сети). Сегодня вроде доделал тестовое приложение для потенциального работодателя, так вот там как раз и попался вариант с данными из сети. Предлагаю фрагмент кода: override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(true) // заполняем данными DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1), execute: { self.gistContentText.text = currentContent ?? "Sorry ...
Line is busy now.
Please go to GISTS LIST and comeback to this gist." }) } // MARK: - TableViewDataSource func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1), execute: { tableView.reloadData() }) return commitList!.count } Вверху была загрузка данных в UITextView с секундной задержкой (можно увеличить, может интернет слабый или данных много, надо по-дольше подождать 3-4 секунды, пробуйте). Ниже в numberOfRowsInSection вызываем обновление таблицы, т.к. изначально количество строк НОЛЬ. И она (таблица) даже узнавая о том, что данные загрузились и массив уже наполнился (у меня запрос был 4-5 раз в секунду, я просто принт там воткнул и разглядывал в консоли все эти фокусы) не хотела вызываться сама по себе. Но, чудо гугления, уроки Ивана Акулова и тяга к опасным экспериментам (по изматываю нервов себе и окружающим) победили. В итоге всё работает. Если кому пригодится - буду рад. Евгений! За Ваши труды снимаю шляпу и (хоть уже и давал зарок просмотреть все Ваши курсы от начала до конца) теперь точно буду все-все-все смотреть, а не частично (по наболевшим вопросам). Буду ждать новых уроков с нетерпением.
Женя, спасибо за труд. Лекция отличная. Я с этой темой знаком, но кое что нового тоже узнал. Понравился детальный подход к объяснению делегата и датаСорс. Для объяснения основ - сделано на отлично! Тема большая и все понятное дело не охватить. Было бы еше круто показать пример с использованием структуры - для предоставления данных таблице (т.е. когда все данные в одном массиве). И как минутку доп материала - показать примеры регистрации ячейки, так как например у меня с этим часто проблемы ) например: let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "cell")
Оч круто! Я в восторге! Огромное спасибо! Еще вопрос! Не смог по названиям найти урок по переходам (segue) между вьюшками! Подскажите где искать плиз!!!
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { print(indexPath.row) } Всегда рандомный номер дает , то есть все таки возвращает не тот row на который нажали... Как быть здесь?
Подскажите, почему myTableView дважды инициализируется. Сначало как переменная myTableView = UITAbleVIew(), а а потом и в методе CcreateTable() первая строка ?
Есть один момент с таблицами - потокобезопасность и вот тут информации очень мало. Смысл в том, что данные для таблицы обычно берутся из массива. И если во время обновления таблицы происходит асинхронное изменение этих данных, вот тут может быть краш приложения. Женя, если будет ещё один урок по таблицам, может уделить немного внимания этой теме? Я думаю многим это будет интересно, т.к. те кто досмотрел твои уроки с самого начала до этого момента не могут уже быть новичками по определению =)). Спасибо тебе за твой труд!
Не понятно для чего мы вызываем вот эти методы. Без них все работает как надо. Или я не прав? закомментил их, но все равно все задуманные функции работают. func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle { return .delete } func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { return true }
22:00 ❗❗❗
!textLabel is depricated now!
for changing of content image or text - use this construction in method ....cellForRowAt:
let cell = table.view.dequeueReusableCell(withIdentifier: identifire, for indexPath)
var contentCell = cell.defaultContentConfiguration()
contentCell.text "...(your text)"
cell.contentConfiguration = contentCell
return cell
😉
Спасибо, Евгений. Ты реально лучше всех все разжевываешь. Благодаря твоему труду многие получили работу и еще больше ребят получат в будущем. Спасибо.
Моё уважение и благодарность за контент из 2024
Реализация Копировать/Вставить для iOS 13:
1. Объявляем переменную *var myPasteBoard = UIPasteboard.general* для записи данных в буфер обмена
2. Подписываем *ViewController* на *UITextFieldDelegate* :
extension ViewController: UITableViewDataSource, UITableViewDelegate, *UITextFieldDelegate*
3. Теперь вставляем в в конце *extension* следующий код:
//MARK: - Копировать/Вставить
// Разрешаем вызов контекстного меню
func tableView(_ tableView: UITableView, shouldShowMenuForRowAt indexPath: IndexPath) -> Bool {
return true
}
// Добавляем кнопку "Копировать" в контекстное меню
func tableView(_ tableView: UITableView, canPerformAction action: Selector, forRowAt indexPath: IndexPath, withSender sender: Any?) -> Bool {
return action == #selector(UIResponderStandardEditActions.copy(_:)) ? true : false
}
// При нажатии на кнопку "Копировать" записываем в myPasteBoard значение выбранной ячейки
func tableView(_ tableView: UITableView, performAction action: Selector, forRowAt indexPath: IndexPath, withSender sender: Any?) {
let cell = tableView.cellForRow(at: indexPath)
myPasteBoard.string = cell!.textLabel?.text
print("Значение ячейки теперь храниться в буфере обмена")
}
*Источник* : www.ioscreator.com/tutorials/use-context-menu-table-view-ios-tutorial
И снова спасибо за великолепный урок!:)
Небольшое обновление. Начиная с iOS 13, методы:
func tableView(_ tableView: UITableView, shouldShowMenuForRowAt indexPath: IndexPath) -> Bool
func tableView(_ tableView: UITableView, canPerformAction action: Selector, forRowAt indexPath: IndexPath, withSender sender: Any?) -> Bool
func tableView(_ tableView: UITableView, performAction action: Selector, forRowAt indexPath: IndexPath, withSender sender: Any?)
помечены как Deprecated. Apple рекомендует использовать новый метод делегата
func tableView(_ tableView: UITableView, contextMenuConfigurationForRowAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration?
Теперь, чтобы реализовать функцию копирования содержимого ячейки, достаточно реализовать один новый метод, вместо трех устаревших
@available(iOS 13.0, *)
func tableView(_ tableView: UITableView, contextMenuConfigurationForRowAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? {
let actionProvider: UIContextMenuActionProvider = { _ in
return UIMenu(title: "Edit", children: [
UIAction(title: "Copy",
handler: { _ in
let cell = tableView.cellForRow(at: indexPath)
let pasteBoard = UIPasteboard.general
pasteBoard.string = cell?.textLabel?.text
})
])
}
return UIContextMenuConfiguration(identifier: "unique-ID" as NSCopying,
previewProvider: nil,
actionProvider: actionProvider)
}
Более подробно об этом рассказано на WWDC (начиная с 41 минуты)
developer.apple.com/videos/play/wwdc2019/224/?time=2505
черт, актуально до сих пор. вот сижу постигаю, действительно важные темы, которые мне помогли затащить задание на курсах и вообще видос помог разобраться. От души!!!
White666ColorSand , не надо никаких курсов проходи эти
@@theswiftdevelopers1301 эхх, новые бы видео от вас, но вы решили курсы сделать платные (
Обещали бороться со злом как говориться…
@@Kwartal1 , если человек не будет кушать он не сможет уроки бесплатные записывать)
@@theswiftdevelopers1301 запиши пжл свежих уроков!)
@@Kwartal1 эти смотрите они актуальные
Классные уроки, спасибо! Один из самых лучших курсов на русском по UIKit или даже самый лучший)
43:20 для того, чтобы появился значок удаления нужно добавит функцию
func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
true
}
Начал смотреть уроки для новичков, рад что проект не заброшен. Спасибо что продолжаете снимать видео!
Спасибо за ваш труд! Прошло уже 2 года, но видео до сих пор актуально для таких новичков, как я)
Евгений спасибо большое, что объясняете базовые темы. Я вот только сейчас понял для чего Data Source и Delegate остальные просто показывают, но ничего про это не говорят. Я как обезьянка повторяю за их уроком, но не понимаю для чего я это делаю. А так сразу все на свои места встает после таких видео!
Спасибо за видео, очень подробно и доходчиво рассказано 👌
Вот этого урока не хватало! Кое-что никогда не использовал. Тема не простая, есть свои подводные камни. По поводу статической таблицы и ViewController-а (2:28). Их можно использовать вместе! для этого нужно кинуть на контроллер Container View, а потом вписать в него TableViewController со статической таблицей и это очень удобно, особенно когда нужно сделать сложный интерфейс в контроллере, т.к. с TableViewController-ом работать в этом плане очень сложно.
спасибо за ваш труд ! очень подробно все разжеванно
Женя, Вы гений! Вы просто гениально растолковываете людям знания, которые другие ораторы описывают так, что фокусы Копперфильда могут показаться проще, чем взаимодействие внутри MVC. Огромное Вам человеческое спасибо за столь ВАЖНЫЙ для каждого начинающего программиста рассказ. Изучаю SWIFT 9 месяцев, пока это видео не посмотрел, так и не понимал про взаимодействие. О том, что DataSourсe передает данные понятно, а вот как обратно (ответ: Как-то передает, фиг знает как.).
В копилку взаимопомощи (товарищ тут раньше спрашивал про тонкости с подгрузкой данных из сети). Сегодня вроде доделал тестовое приложение для потенциального работодателя, так вот там как раз и попался вариант с данными из сети. Предлагаю фрагмент кода:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
// заполняем данными
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1), execute: {
self.gistContentText.text = currentContent ??
"Sorry ...
Line is busy now.
Please go to GISTS LIST
and comeback to this gist."
})
}
// MARK: - TableViewDataSource
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1), execute: {
tableView.reloadData()
})
return commitList!.count
}
Вверху была загрузка данных в UITextView с секундной задержкой (можно увеличить, может интернет слабый или данных много, надо по-дольше подождать 3-4 секунды, пробуйте). Ниже в numberOfRowsInSection вызываем обновление таблицы, т.к. изначально количество строк НОЛЬ. И она (таблица) даже узнавая о том, что данные загрузились и массив уже наполнился (у меня запрос был 4-5 раз в секунду, я просто принт там воткнул и разглядывал в консоли все эти фокусы) не хотела вызываться сама по себе. Но, чудо гугления, уроки Ивана Акулова и тяга к опасным экспериментам (по изматываю нервов себе и окружающим) победили. В итоге всё работает. Если кому пригодится - буду рад.
Евгений! За Ваши труды снимаю шляпу и (хоть уже и давал зарок просмотреть все Ваши курсы от начала до конца) теперь точно буду все-все-все смотреть, а не частично (по наболевшим вопросам).
Буду ждать новых уроков с нетерпением.
как ваши успехи?
Спасибо!😃Отличное видео!🏆Очень понравилось, что показал как работать и через код и через сториборд!!Спасибо Огромное!
Афигенный урок ! ) Очередная пачка полезностей ) Благодарю ! )
Спасибо, что ты есть! Спасибо за твои старания!
душевно и доступно! Удачи в делах!
Огромное вам спасибо!
Каждый урок жду с нетерпением!
Женя, спасибо за труд. Лекция отличная. Я с этой темой знаком, но кое что нового тоже узнал. Понравился детальный подход к объяснению делегата и датаСорс. Для объяснения основ - сделано на отлично! Тема большая и все понятное дело не охватить. Было бы еше круто показать пример с использованием структуры - для предоставления данных таблице (т.е. когда все данные в одном массиве). И как минутку доп материала - показать примеры регистрации ячейки, так как например у меня с этим часто проблемы ) например: let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "cell")
В следующем уроке что то придумаю
Контекстное меню с функцией копирования
func tableView(_ tableView: UITableView, contextMenuConfigurationForRowAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? {
return UIContextMenuConfiguration(identifier: nil, previewProvider: nil) { _ -> UIMenu? in
let copyAction = UIAction(title: "Copy", image: UIImage(systemName: "doc.on.doc")) { action in
UIPasteboard.general.string = self.array[indexPath.row]
}
return UIMenu(title: "", image: nil, identifier: nil, options: [], children: [copyAction])
}
}
Лучший гуру, счастья тебе :) и спасибо
Очень доступно для понимания, спасибо
Огромное вам спасибо за ваш труд!!
Очень понравился урок! Спасибо!
спасибо подробное объяснение !)
Огромное спасибо за урок!
Спасибо, Евгений.
Супер спасибо за TableView!!!
Супер, спасибо за разъяснение!
Спасибо , урок очень полезный. Классно было бы ещё показать переход на другой контролёр , при нажатии на ячейку. Типа как в тел. Книге
Антон Микляев в 27 уроке
Понял, спасибо ещё не смотрел.
Спасибо! Очень доступно и информативно!
Крутая работа! Мне нравится.
Оч круто! Я в восторге! Огромное спасибо!
Еще вопрос! Не смог по названиям найти урок по переходам (segue) между вьюшками! Подскажите где искать плиз!!!
Большое спасибо!
отличный урок!!! Спасибо!!!
СУПЕР!) СПАСИБО!
Спасибо!
Спасибо огромное за данный урок очень круто!!!!!!!!! единственное бесят констрейны которые я вообще от слова не понял, буду нанимать репетитора((
Спасибо огромное!!!!
Спасибо
Спасибо за Вашу работу.А Вы могли бы рассказать в одном из своих видео о GitHub?
Классный урок !!!
Все отлично, а есть добавление ячейки с помощью какой-нибудь кнопки?
Спосибо Бальшое!!!
Очень крутой урок !)
Разжевано хорошо,но нужно чтобы это еще отложилось.Крепите кошелек к видео.Любой труд должен быть оплачен.
Big man have a big heart :)
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
print(indexPath.row)
}
Всегда рандомный номер дает , то есть все таки возвращает не тот row на который нажали... Как быть здесь?
👍👍👍👍
Подскажите, почему myTableView дважды инициализируется. Сначало как переменная myTableView = UITAbleVIew(), а а потом и в методе CcreateTable() первая строка ?
Copy почему-то не получилось сделать, при нажатии не выскакивала плашка на симуляторе
лучший =)
Домашнего задания нет?
Есть один момент с таблицами - потокобезопасность и вот тут информации очень мало. Смысл в том, что данные для таблицы обычно берутся из массива. И если во время обновления таблицы происходит асинхронное изменение этих данных, вот тут может быть краш приложения. Женя, если будет ещё один урок по таблицам, может уделить немного внимания этой теме? Я думаю многим это будет интересно, т.к. те кто досмотрел твои уроки с самого начала до этого момента не могут уже быть новичками по определению =)). Спасибо тебе за твой труд!
Sergey Bizunov , спасибо так приятно сказал
лайк
Не понятно для чего мы вызываем вот эти методы. Без них все работает как надо. Или я не прав? закомментил их, но все равно все задуманные функции работают.
func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
return .delete
}
func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
return true
}
без них не будет работат
У вас случайно не хакинтош ? если да у вас тоже симуляторе кроме iPhone 5S и iPhone SE ничего не запускается
у меня хак. все запускается
виртуалка и тоже все запускается
делигат и протокол,
Уроки прекрасные, спасибо вам за этот огромный труд.
На мой взгляд заставка ужасная
ставим лойс если тоже ниче не поняли(
Огромное вам спасибо!!!)))
Супер, спасибо !!!
Спасибо
Спасибо !