Swift c нуля: UIKit урок 25 - UITableView

Поділитися
Вставка
  • Опубліковано 27 жов 2024

КОМЕНТАРІ • 80

  • @pasha7324
    @pasha7324 6 років тому +51

    Спасибо, Евгений. Ты реально лучше всех все разжевываешь. Благодаря твоему труду многие получили работу и еще больше ребят получат в будущем. Спасибо.

  • @andrewsteellson9991
    @andrewsteellson9991 2 роки тому +13

    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
    😉

  • @АртемСыряный-ч6о
    @АртемСыряный-ч6о 3 роки тому +7

    И снова спасибо за великолепный урок!:)
    Небольшое обновление. Начиная с 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

  • @emil42661
    @emil42661 4 роки тому +13

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

    • @theswiftdevelopers1301
      @theswiftdevelopers1301  4 роки тому +5

      White666ColorSand , не надо никаких курсов проходи эти

    • @Kwartal1
      @Kwartal1 2 роки тому

      @@theswiftdevelopers1301 эхх, новые бы видео от вас, но вы решили курсы сделать платные (
      Обещали бороться со злом как говориться…

    • @theswiftdevelopers1301
      @theswiftdevelopers1301  2 роки тому +2

      @@Kwartal1 , если человек не будет кушать он не сможет уроки бесплатные записывать)

    • @Kwartal1
      @Kwartal1 2 роки тому

      @@theswiftdevelopers1301 запиши пжл свежих уроков!)

    • @theswiftdevelopers1301
      @theswiftdevelopers1301  2 роки тому

      @@Kwartal1 эти смотрите они актуальные

  • @kostanichkataev6961
    @kostanichkataev6961 6 місяців тому

    Моё уважение и благодарность за контент из 2024

  • @Помка-л6я
    @Помка-л6я 6 років тому +10

    Начал смотреть уроки для новичков, рад что проект не заброшен. Спасибо что продолжаете снимать видео!

  • @yacoder-proit
    @yacoder-proit Рік тому

    Классные уроки, спасибо! Один из самых лучших курсов на русском по UIKit или даже самый лучший)

  • @Александра-ш8ж1б
    @Александра-ш8ж1б 4 роки тому +3

    Спасибо за ваш труд! Прошло уже 2 года, но видео до сих пор актуально для таких новичков, как я)

  • @ВладиславДенисов-з3ы

    Евгений спасибо большое, что объясняете базовые темы. Я вот только сейчас понял для чего Data Source и Delegate остальные просто показывают, но ничего про это не говорят. Я как обезьянка повторяю за их уроком, но не понимаю для чего я это делаю. А так сразу все на свои места встает после таких видео!

  • @sergeybizunov6387
    @sergeybizunov6387 6 років тому +4

    Вот этого урока не хватало! Кое-что никогда не использовал. Тема не простая, есть свои подводные камни. По поводу статической таблицы и ViewController-а (2:28). Их можно использовать вместе! для этого нужно кинуть на контроллер Container View, а потом вписать в него TableViewController со статической таблицей и это очень удобно, особенно когда нужно сделать сложный интерфейс в контроллере, т.к. с TableViewController-ом работать в этом плане очень сложно.

  • @vovamik
    @vovamik 6 років тому +3

    Женя, Вы гений! Вы просто гениально растолковываете людям знания, которые другие ораторы описывают так, что фокусы Копперфильда могут показаться проще, чем взаимодействие внутри 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 раз в секунду, я просто принт там воткнул и разглядывал в консоли все эти фокусы) не хотела вызываться сама по себе. Но, чудо гугления, уроки Ивана Акулова и тяга к опасным экспериментам (по изматываю нервов себе и окружающим) победили. В итоге всё работает. Если кому пригодится - буду рад.
    Евгений! За Ваши труды снимаю шляпу и (хоть уже и давал зарок просмотреть все Ваши курсы от начала до конца) теперь точно буду все-все-все смотреть, а не частично (по наболевшим вопросам).
    Буду ждать новых уроков с нетерпением.

  • @watafakaya
    @watafakaya 2 роки тому +3

    43:20 для того, чтобы появился значок удаления нужно добавит функцию
    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    true
    }

  • @ВадимСлободянюк-н3у

    Реализация Копировать/Вставить для 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

  • @evgeny3400
    @evgeny3400 6 років тому +6

    Женя, спасибо за труд. Лекция отличная. Я с этой темой знаком, но кое что нового тоже узнал. Понравился детальный подход к объяснению делегата и датаСорс. Для объяснения основ - сделано на отлично! Тема большая и все понятное дело не охватить. Было бы еше круто показать пример с использованием структуры - для предоставления данных таблице (т.е. когда все данные в одном массиве). И как минутку доп материала - показать примеры регистрации ячейки, так как например у меня с этим часто проблемы ) например: let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "cell")

  • @ТимурСаттаров-ш6ч

    Спасибо за видео, очень подробно и доходчиво рассказано 👌

  • @TheIvan1501
    @TheIvan1501 6 років тому +1

    Спасибо, что ты есть! Спасибо за твои старания!

  • @caspernew6697
    @caspernew6697 4 роки тому

    Афигенный урок ! ) Очередная пачка полезностей ) Благодарю ! )

  • @ОлесяУкраинская-т1д

    Спасибо!😃Отличное видео!🏆Очень понравилось, что показал как работать и через код и через сториборд!!Спасибо Огромное!

  • @Sanche87
    @Sanche87 Рік тому

    спасибо за ваш труд ! очень подробно все разжеванно

  • @Kfilmos
    @Kfilmos 6 років тому +1

    душевно и доступно! Удачи в делах!

  • @Shandnbro
    @Shandnbro 6 років тому +1

    Огромное вам спасибо!
    Каждый урок жду с нетерпением!

  • @sanchezcodez9359
    @sanchezcodez9359 2 роки тому

    Лучший гуру, счастья тебе :) и спасибо

  • @laisermed
    @laisermed 6 років тому +1

    Очень доступно для понимания, спасибо

  • @nadzeyasivukha8297
    @nadzeyasivukha8297 6 років тому +1

    Очень понравился урок! Спасибо!

  • @Murakasi
    @Murakasi 2 роки тому

    Огромное вам спасибо за ваш труд!!

  • @حكموأمثال-ل9ن
    @حكموأمثال-ل9ن 3 роки тому +1

    спасибо подробное объяснение !)

  • @user-iOSnick-dev
    @user-iOSnick-dev 2 роки тому

    Огромное спасибо за урок!

  • @rustrust1792
    @rustrust1792 5 років тому

    Спасибо, Евгений.

  • @МаратНазмутдинов-ы5н

    Супер, спасибо за разъяснение!

  • @MegaDigri
    @MegaDigri 6 років тому +1

    Супер спасибо за TableView!!!

  • @fedorlosev616
    @fedorlosev616 5 років тому

    Крутая работа! Мне нравится.

  • @crazyfox1317
    @crazyfox1317 5 років тому

    Спасибо! Очень доступно и информативно!

  • @Johan-jg8zq
    @Johan-jg8zq 6 років тому +1

    СУПЕР!) СПАСИБО!

  • @hryst19
    @hryst19 5 років тому +1

    Спасибо , урок очень полезный. Классно было бы ещё показать переход на другой контролёр , при нажатии на ячейку. Типа как в тел. Книге

    • @theswiftdevelopers1301
      @theswiftdevelopers1301  5 років тому

      Антон Микляев в 27 уроке

    • @hryst19
      @hryst19 5 років тому

      Понял, спасибо ещё не смотрел.

  • @vladpodvoiskyi2307
    @vladpodvoiskyi2307 6 років тому +1

    отличный урок!!! Спасибо!!!

  • @alexanderushakov4892
    @alexanderushakov4892 6 років тому +2

    Большое спасибо!

  • @steplerstationery5231
    @steplerstationery5231 4 роки тому +1

    Оч круто! Я в восторге! Огромное спасибо!
    Еще вопрос! Не смог по названиям найти урок по переходам (segue) между вьюшками! Подскажите где искать плиз!!!

  • @saidaxmadansoriddinov6119
    @saidaxmadansoriddinov6119 2 роки тому

    Классный урок !!!

  • @ДобрыняЗахаров-е6к
    @ДобрыняЗахаров-е6к 6 років тому

    Очень крутой урок !)

  • @rimmas2020
    @rimmas2020 2 роки тому

    Спасибо огромное!!!!

  • @ArchProCinema
    @ArchProCinema 4 роки тому

    Супер, спасибо !!!

  • @lolimipo3114
    @lolimipo3114 Рік тому

    Спасибо огромное за данный урок очень круто!!!!!!!!! единственное бесят констрейны которые я вообще от слова не понял, буду нанимать репетитора((

  • @IhorFedii-n1i
    @IhorFedii-n1i 5 років тому +1

    Спасибо!

  • @edwardx4743
    @edwardx4743 2 роки тому

    Big man have a big heart :)

  • @iosone9759
    @iosone9759 2 роки тому

    Все отлично, а есть добавление ячейки с помощью какой-нибудь кнопки?

  • @vazgensargsyan9914
    @vazgensargsyan9914 5 років тому

    Спосибо Бальшое!!!

  • @dashashevchenko2518
    @dashashevchenko2518 3 роки тому

    Спасибо за Вашу работу.А Вы могли бы рассказать в одном из своих видео о GitHub?

  • @yuriykalandarov9661
    @yuriykalandarov9661 2 роки тому

    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
    print(indexPath.row)
    }
    Всегда рандомный номер дает , то есть все таки возвращает не тот row на который нажали... Как быть здесь?

  • @stanislavsky85
    @stanislavsky85 3 роки тому

    Разжевано хорошо,но нужно чтобы это еще отложилось.Крепите кошелек к видео.Любой труд должен быть оплачен.

  • @demart
    @demart 5 років тому +1

    Спасибо

  • @explo9087
    @explo9087 6 років тому

    Подскажите, почему myTableView дважды инициализируется. Сначало как переменная myTableView = UITAbleVIew(), а а потом и в методе CcreateTable() первая строка ?

  • @MrSterium
    @MrSterium 4 роки тому

    лучший =)

  • @exey.artwork
    @exey.artwork 4 роки тому

    Copy почему-то не получилось сделать, при нажатии не выскакивала плашка на симуляторе

  • @ABC-tv9zy
    @ABC-tv9zy 11 місяців тому

    👍👍👍👍

  • @vitys1000
    @vitys1000 6 років тому +1

    Домашнего задания нет?

  • @just_SmK
    @just_SmK Рік тому

    Контекстное меню с функцией копирования
    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])
    }
    }

  • @sergeybizunov6387
    @sergeybizunov6387 6 років тому +2

    Есть один момент с таблицами - потокобезопасность и вот тут информации очень мало. Смысл в том, что данные для таблицы обычно берутся из массива. И если во время обновления таблицы происходит асинхронное изменение этих данных, вот тут может быть краш приложения. Женя, если будет ещё один урок по таблицам, может уделить немного внимания этой теме? Я думаю многим это будет интересно, т.к. те кто досмотрел твои уроки с самого начала до этого момента не могут уже быть новичками по определению =)). Спасибо тебе за твой труд!

  • @andrusia2048
    @andrusia2048 2 роки тому

    лайк

  • @User714-u7t
    @User714-u7t 6 років тому +2

    Не понятно для чего мы вызываем вот эти методы. Без них все работает как надо. Или я не прав? закомментил их, но все равно все задуманные функции работают.
    func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
    return .delete
    }
    func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
    return true
    }

  • @Maxmudjon
    @Maxmudjon 6 років тому

    У вас случайно не хакинтош ? если да у вас тоже симуляторе кроме iPhone 5S и iPhone SE ничего не запускается

    • @РадимГасанов
      @РадимГасанов 5 років тому

      у меня хак. все запускается

    • @ZQutui
      @ZQutui 5 років тому

      виртуалка и тоже все запускается

  • @vladimirl7413
    @vladimirl7413 5 років тому

    Уроки прекрасные, спасибо вам за этот огромный труд.
    На мой взгляд заставка ужасная

  • @AntonBear
    @AntonBear 2 роки тому

    делигат и протокол,

  • @Storage-u9c
    @Storage-u9c 5 років тому +3

    ставим лойс если тоже ниче не поняли(

  • @leshaaleshaaa
    @leshaaleshaaa 4 роки тому

    Спасибо !

  • @FominValera
    @FominValera 3 роки тому

    Спасибо

  • @martinreparuk7989
    @martinreparuk7989 4 роки тому

    Огромное вам спасибо!!!)))