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 😉
черт, актуально до сих пор. вот сижу постигаю, действительно важные темы, которые мне помогли затащить задание на курсах и вообще видос помог разобраться. От души!!!
Евгений спасибо большое, что объясняете базовые темы. Я вот только сейчас понял для чего 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 раз в секунду, я просто принт там воткнул и разглядывал в консоли все эти фокусы) не хотела вызываться сама по себе. Но, чудо гугления, уроки Ивана Акулова и тяга к опасным экспериментам (по изматываю нервов себе и окружающим) победили. В итоге всё работает. Если кому пригодится - буду рад. Евгений! За Ваши труды снимаю шляпу и (хоть уже и давал зарок просмотреть все Ваши курсы от начала до конца) теперь точно буду все-все-все смотреть, а не частично (по наболевшим вопросам). Буду ждать новых уроков с нетерпением.
43:20 для того, чтобы появился значок удаления нужно добавит функцию func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { true }
Женя, спасибо за труд. Лекция отличная. Я с этой темой знаком, но кое что нового тоже узнал. Понравился детальный подход к объяснению делегата и датаСорс. Для объяснения основ - сделано на отлично! Тема большая и все понятное дело не охватить. Было бы еше круто показать пример с использованием структуры - для предоставления данных таблице (т.е. когда все данные в одном массиве). И как минутку доп материала - показать примеры регистрации ячейки, так как например у меня с этим часто проблемы ) например: 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
😉
И снова спасибо за великолепный урок!:)
Небольшое обновление. Начиная с 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 эти смотрите они актуальные
Моё уважение и благодарность за контент из 2024
Начал смотреть уроки для новичков, рад что проект не заброшен. Спасибо что продолжаете снимать видео!
Классные уроки, спасибо! Один из самых лучших курсов на русском по UIKit или даже самый лучший)
Спасибо за ваш труд! Прошло уже 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 раз в секунду, я просто принт там воткнул и разглядывал в консоли все эти фокусы) не хотела вызываться сама по себе. Но, чудо гугления, уроки Ивана Акулова и тяга к опасным экспериментам (по изматываю нервов себе и окружающим) победили. В итоге всё работает. Если кому пригодится - буду рад.
Евгений! За Ваши труды снимаю шляпу и (хоть уже и давал зарок просмотреть все Ваши курсы от начала до конца) теперь точно буду все-все-все смотреть, а не частично (по наболевшим вопросам).
Буду ждать новых уроков с нетерпением.
как ваши успехи?
43:20 для того, чтобы появился значок удаления нужно добавит функцию
func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
true
}
Реализация Копировать/Вставить для 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
Женя, спасибо за труд. Лекция отличная. Я с этой темой знаком, но кое что нового тоже узнал. Понравился детальный подход к объяснению делегата и датаСорс. Для объяснения основ - сделано на отлично! Тема большая и все понятное дело не охватить. Было бы еше круто показать пример с использованием структуры - для предоставления данных таблице (т.е. когда все данные в одном массиве). И как минутку доп материала - показать примеры регистрации ячейки, так как например у меня с этим часто проблемы ) например: let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "cell")
В следующем уроке что то придумаю
Спасибо за видео, очень подробно и доходчиво рассказано 👌
Спасибо, что ты есть! Спасибо за твои старания!
Афигенный урок ! ) Очередная пачка полезностей ) Благодарю ! )
Спасибо!😃Отличное видео!🏆Очень понравилось, что показал как работать и через код и через сториборд!!Спасибо Огромное!
спасибо за ваш труд ! очень подробно все разжеванно
душевно и доступно! Удачи в делах!
Огромное вам спасибо!
Каждый урок жду с нетерпением!
Лучший гуру, счастья тебе :) и спасибо
Очень доступно для понимания, спасибо
Очень понравился урок! Спасибо!
Огромное вам спасибо за ваш труд!!
спасибо подробное объяснение !)
Огромное спасибо за урок!
Спасибо, Евгений.
Супер, спасибо за разъяснение!
Супер спасибо за TableView!!!
Крутая работа! Мне нравится.
Спасибо! Очень доступно и информативно!
СУПЕР!) СПАСИБО!
Спасибо , урок очень полезный. Классно было бы ещё показать переход на другой контролёр , при нажатии на ячейку. Типа как в тел. Книге
Антон Микляев в 27 уроке
Понял, спасибо ещё не смотрел.
отличный урок!!! Спасибо!!!
Большое спасибо!
Оч круто! Я в восторге! Огромное спасибо!
Еще вопрос! Не смог по названиям найти урок по переходам (segue) между вьюшками! Подскажите где искать плиз!!!
Классный урок !!!
Очень крутой урок !)
Спасибо огромное!!!!
Супер, спасибо !!!
Спасибо огромное за данный урок очень круто!!!!!!!!! единственное бесят констрейны которые я вообще от слова не понял, буду нанимать репетитора((
Спасибо!
Big man have a big heart :)
Все отлично, а есть добавление ячейки с помощью какой-нибудь кнопки?
Спосибо Бальшое!!!
Спасибо за Вашу работу.А Вы могли бы рассказать в одном из своих видео о GitHub?
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
print(indexPath.row)
}
Всегда рандомный номер дает , то есть все таки возвращает не тот row на который нажали... Как быть здесь?
Разжевано хорошо,но нужно чтобы это еще отложилось.Крепите кошелек к видео.Любой труд должен быть оплачен.
Спасибо
Подскажите, почему myTableView дважды инициализируется. Сначало как переменная myTableView = UITAbleVIew(), а а потом и в методе CcreateTable() первая строка ?
лучший =)
Copy почему-то не получилось сделать, при нажатии не выскакивала плашка на симуляторе
👍👍👍👍
Домашнего задания нет?
Контекстное меню с функцией копирования
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])
}
}
Есть один момент с таблицами - потокобезопасность и вот тут информации очень мало. Смысл в том, что данные для таблицы обычно берутся из массива. И если во время обновления таблицы происходит асинхронное изменение этих данных, вот тут может быть краш приложения. Женя, если будет ещё один урок по таблицам, может уделить немного внимания этой теме? Я думаю многим это будет интересно, т.к. те кто досмотрел твои уроки с самого начала до этого момента не могут уже быть новичками по определению =)). Спасибо тебе за твой труд!
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 ничего не запускается
у меня хак. все запускается
виртуалка и тоже все запускается
Уроки прекрасные, спасибо вам за этот огромный труд.
На мой взгляд заставка ужасная
делигат и протокол,
ставим лойс если тоже ниче не поняли(
Спасибо !
Спасибо
Огромное вам спасибо!!!)))