Проблема с длительным нажатием и жестом панорамирования ячейки табличного представления ⇐ IOS
Проблема с длительным нажатием и жестом панорамирования ячейки табличного представления
Я создал кнопку удаления для просмотра таблицы, которая открывается при пролистывании жестом панорамирования. я мог бы сделать это с помощью UIContextualAction, но не могу настроить внешний вид кнопки. поэтому я решил сделать кнопку сам. созданная мной функция панорамирования также работала, но есть проблема. когда я удерживаю ячейку (длительное нажатие), пока ячейка прокручивается влево, ячейка мгновенно возвращается в предыдущее состояние. как я могу это предотвратить? есть два класса, связанных с этой темой: TableViewCell и ViewController
вот мой класс TableViewCell
импортировать UIKit импортировать CoreData протокол TableViewCellDelegate: AnyObject { func DidRequestDelete (_ ячейка: TableViewCell) } класс TableViewCell: UITableViewCell { пусть titleLabel = UILabel() пусть noteLabel = UILabel() пусть dateLabel = UILabel() пусть timeLabel = UILabel() пусть dateFormatter = DateFormatter() пусть timeFormatter = DateFormatter() пусть deleteButton = UIButton() слабый делегат var: TableViewCellDelegate? переопределить init(стиль: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(стиль: стиль, reuseIdentifier: reuseIdentifier) dateFormatter.dateFormat = "дд/мм/гггг" timeFormatter.dateFormat = "ЧЧ:мм" выборСтиль = .none настройкаDeleteButton() contentView.layer.cornerRadius = 15 contentView.layer.borderWidth = 2 contentView.clipsToBounds = ложь фонЦвет = UIColor.clear backgroundView?.backgroundColor = UIColor.clear selectedBackgroundView?.backgroundColor = UIColor.clear setLabel (метка: titleLabel, textColor: .systemGray5, FontSize: 22, NumberOfLine: 0).isEnabled = false setLabel (метка: noteLabel, textColor: .systemGray5, FontSize: 18, NumberOfLine: 3).isHidden = false setLabel (метка: dateLabel, textColor: .systemGray, FontSize: 14, NumberOfLine: 1).isHidden = false setLabel (метка: timeLabel, textColor: .systemGray, FontSize: 14, NumberOfLine: 1).isHidden = false addContentView (просмотры: [titleLabel, noteLabel, dateLabel, timeLabel]) пусть colorIndex = UserDefaults.standard.integer(forKey: "index") setupBasedOnColors (индекс: colorIndex) настройкаConstraints() let leftSwipeGesture = UIPanGestureRecouncer(target: self, action: #selector(handleLeftSwipe(_:))) contentView.addGestureRecouncer(leftSwipeGesture) let TapGesture = UITapGestureRecouncer(target: self, action: #selector(handleCellTap(_:))) TapGesture.delegate = сам contentView.addGestureRecouncer(tapGesture) } требуется инициализация?(кодер aDecoder: NSCoder) { FatalError("init(coder:) не реализован") } переопределить func hitTest (_ точка: CGPoint, с событием: UIEvent?) -> UIView? { пусть pointForTargetView = deleteButton.convert(point, from: self) если deleteButton.bounds.contains(pointForTargetView) { вернуть кнопку удаления } вернуть super.hitTest(точка, с: событием) } функция setupBasedOnColors (индекс: Int) { индекс переключения { случай 0: contentView.layer.borderColor = UIColor(красный: 0,7, зеленый: 0,7, синий: 0,7, альфа: 1).cgColor Дело 1: contentView.layer.borderColor = UIColor.systemPink.cgColor случай 2: contentView.layer.borderColor = UIColor.systemGray3.cgColor случай 3: contentView.layer.borderColor = UIColor.systemBlue.cgColor случай 4: contentView.layer.borderColor = UIColor.systemYellow.cgColor случай 5: contentView.layer.borderColor = UIColor(красный: 0,3, зеленый: 0,3, синий: 0,3, альфа: 1).cgColor по умолчанию: print("Рэнк Булунамады") } contentView.setNeedsDisplay() } функция setupDeleteButton(){ contentView.addSubview(deleteButton) deleteButton.setImage(UIImage(systemName: «trash»), для: .normal) deleteButton.layer.cornerRadius = 15 deleteButton.tintColor = .white deleteButton.addTarget(self, действие: #selector(deleteButtonTapped), для: .touchUpInside) deleteButton.isUserInteractionEnabled = true } func setLabel (метка: UILabel, textColor: UIColor, fontSize: CGFloat, NumberOfLine: Int) -> UILabel { label.textColor = цвет текста label.font = UIFont.systemFont(ofSize: fontSize) label.numberOfLines = число_строки возвратная этикетка } func addContentView (просмотры: [UILabel]) { views.forEach { просмотр в contentView.addSubview(представление) } } частная функция setupConstraints() { titleLabel.translatesAutoresizingMaskIntoConstraints = false noteLabel.translatesAutoresizingMaskIntoConstraints = false dateLabel.translatesAutoresizingMaskIntoConstraints = false timeLabel.translatesAutoresizingMaskIntoConstraints = false deleteButton.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ titleLabel.topAnchor.constraint(equalTo: contentView.topAnchor, константа: 10), titleLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, константа: 10), titleLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, константа: -10), deleteButton.leadingAnchor.constraint(equalTo: contentView.trailingAnchor, константа: 6), deleteButton.topAnchor.constraint(equalTo: contentView.topAnchor), deleteButton.bottomAnchor.constraint(equalTo: contentView.bottomAnchor), deleteButton.widthAnchor.constraint(equalToConstant: 100), noteLabel.topAnchor.constraint(equalTo: titleLabel.bottomAnchor, константа: 5), noteLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, константа: 10), noteLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, константа: -10), noteLabel.bottomAnchor.constraint(equalTo: dateLabel.topAnchor, константа: -10), dateLabel.topAnchor.constraint(equalTo: noteLabel.bottomAnchor, константа: 10), dateLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, константа: 10), dateLabel.trailingAnchor.constraint(equalTo: timeLabel.leadingAnchor, константа: -15), dateLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, константа: -10), timeLabel.topAnchor.constraint(equalTo: dateLabel.topAnchor), timeLabel.leadingAnchor.constraint(equalTo: dateLabel.trailingAnchor, константа: 20), timeLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, константа: -9) ]) } func configure (с примечанием: NoteText) { titleLabel.text = note.title noteLabel.text = note.text если пусть дата = note.date { timeLabel.text = timeFormatter.string(от: дата) } еще { timeLabel.text = "Нет времени" } если пусть дата = note.date { configureCellDateLabel (с: датой) } еще { dateLabel.text = "Нет даты" } } func configureCellDateLabel (с датой: Дата) { пусть календарь = Calendar.current если календарь.isDateInToday(дата) { dateLabel.text = "Сегодня" } еще { dateFormatter.dateFormat = "дд/мм/гггг" dateLabel.text = dateFormatter.string(от: дата) } } @objc func handleLeftSwipe (_ жест: UIPanGestureRecouncer) { пусть перевод = жест.перевод (в: contentView) если жест.состояние == .changed { пусть newPosition = max(translation.x, -(deleteButton.frame.width + 7)) если newPosition Бул { вернуть contentView.frame.origin.x != 0 } @objc func deleteButtonTapped(){ делегат?.didRequestDelete(self) } }
Я пытался добавить некоторые условия в функцию DidSelectRowAt в классе ViewController, но это не сработало.
импортировать UIKit импортировать CoreData класс ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, TableViewCellDelegate { контекст var: NSManagedObjectContext! пусть tableView = UITableView() пусть createNoteButton = UIButton() пусть cellSpacing: CGFloat = 6 var fetchedNotes: [NoteText] = [] вар titleLabel = UILabel() вар selectedIndexPath: IndexPath? вар randomLabel = UILabel() вар случайныйЦвет = UIColor() вар случайныйBool = Bool() пусть dateFormatter = DateFormatter() пусть timeFormatter = DateFormatter() ленивый вар optionsMarkItem : UIBarButtonItem = { let item = UIBarButtonItem(изображение: UIImage(systemName: "gearshape.fill"), стиль: .plain, цель: self, действие: #selector(optionsButtonTapped)) item.tintColor = .systemYellow вернуть изделие }() //МАРК: viewDidLoad переопределить функцию viewDidLoad() { супер.viewDidLoad() view.backgroundColor = .черный настройкаTableView() для семьи в UIFont.familyNames.sorted() { print("\(семья)") для имени в UIFont.fontNames(forFamilyName: Family).sorted() { print("== \(имя)") } } Guard пусть appDelegate = UIApplication.shared.delegate как? AppDelegate еще { FatalError("Невозможно получить делегат приложения") } контекст = appDelegate.persistentContainer.viewContext настройкаCreateNoteButton() RandomLabel.isHidden = правда настройкаTitleLabel() tableView.backgroundColor = .black tableView.delegate = сам tableView.dataSource = сам выборкаNotes() NavigationItem.rightBarButtonItem = optionsMarkItem let longPressGestureButton = UILongPressGestureRecouncer(цель: self, action: #selector(handleLongPressCell)) let longPressGestureCell = UILongPressGestureRecouncer(цель: self, действие: #selector(handleLongPressButton)) longPressGestureCell.minimumPressDuration = 0,2 longPressGestureButton.minimumPressDuration = 0,2 tableView.addGestureRecouncer(longPressGestureButton) createNoteButton.addGestureRecouncer(longPressGestureCell) let switchValue = UserDefaults.standard.bool(forKey: "mySwitchValue") setupUIBasedOnSwitch (switchValue: switchValue) } // ОТМЕТКА: viewWillAppear переопределить func viewWillAppear(_animated: Bool) { super.viewWillAppear(анимированный) выборкаNotes() tableView.delegate = сам tableView.dataSource = сам let switchValue = UserDefaults.standard.bool(forKey: "mySwitchValue") setupUIBasedOnSwitch (switchValue: switchValue) dateFormatter.dateFormat = "дд/мм/гггг" timeFormatter.dateFormat = "ЧЧ:мм" пусть colorIndex = UserDefaults.standard.integer(forKey: "index") setupBasedOnColors (индекс: colorIndex) } // ОТМЕТКА: UserDefaults получает функции func getIndexValue() -> Int{ пусть index = UserDefaults.standard.integer(forKey: "index") индекс возврата } //MARK: Основные данные функция fetchNotes() { пусть запрос: NSFetchRequest = ПримечаниеТекст.fetchRequest() делать { fetchedNotes = попробуйте context.fetch(запрос) } ловить { print("Не найдено: \(ошибка)") } tableView.reloadData() } func addNoteWithTitle(_ title: String, text: String, date: Date, time: Date) { пусть newNote = NoteText(контекст: контекст) newNote.title = заголовок newNote.text = текст newNote.date = дата newNote.time = дата делать { попробуйте context.save() fetchNotes() // Список списка } ловить { print("Не найдено: \(ошибка)") } } func deleteNoteAtIndexPath (_ indexPath: IndexPath) { let noteToDelete = fetchedNotes[indexPath.section] context.delete(noteToDelete) fetchedNotes.remove(в: indexPath.section) делать { попробуйте context.save() tableView.beginUpdates() tableView.deleteSections([indexPath.section], с: .automatic) tableView.endUpdates() } ловить { print("Это не так: \(ошибка)") } } //ОТМЕТКА: настройка фоновых сообщений функция setupTableView() { view.addSubview(tableView) tableView.dataSource = сам tableView.delegate = сам tableView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ tableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, константа: 20), tableView.leftAnchor.constraint(equalTo: view.leftAnchor, константа: 5), tableView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, константа: -50), tableView.rightAnchor.constraint(equalTo: view.rightAnchor, константа: -5) ]) tableView.register(TableViewCell.self, forCellReuseIdentifier: "TableViewCell") } функция setupCreateNoteButton() { view.addSubview(createNoteButton) пусть символConfiguration = UIImage.SymbolConfiguration(pointSize: 45, вес: .regular, масштаб: .default) // "+" изолируем и настраиваем эклийоруз let plusSymbol = UIImage (имя системы: «плюс», withConfiguration:symbolConfiguration) createNoteButton.setImage(plusSymbol, for: .normal) createNoteButton.tintColor = .systemYellow // "+" Меняем цвет знака на желтый // Создаем пустой кружок для кнопки createNoteButton.backgroundColor = .clear // Делаем фон кнопки прозрачным createNoteButton.layer.cornerRadius = 35 // Устанавливаем радиус кнопки createNoteButton.layer.borderWidth = 2 // Ширина границы createNoteButton.layer.borderColor = UIColor.systemYellow.cgColor createNoteButton.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ createNoteButton.heightAnchor.constraint(equalToConstant: 70), createNoteButton.widthAnchor.constraint(equalToConstant: 70), createNoteButton.rightAnchor.constraint(equalTo: view.rightAnchor, константа: -20), createNoteButton.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, константа: -55) ]) createNoteButton.addTarget(self, действие: #selector(createNoteButtonTapped), для: .touchUpInside) } функция setupTitleLabel() { titleLabel.text = "TextCrypt" titleLabel.font = UIFont(имя: «TimesNewRomanPS-BoldMT», размер: 27) titleLabel.textColor = .white NavigationItem.titleView = titleLabel } func setupUIBasedOnSwitch (switchValue: Bool) { если переключательValue { view.backgroundColor = .white tableView.backgroundColor = .white randomLabel.textColor = .черный titleLabel.textColor = .черный // randomColor = UIColor(красный: 0,9, зеленый: 0,9, синий: 0,9, альфа: 1) случайный цвет = .белый } еще { view.backgroundColor = .черный tableView.backgroundColor = .black randomLabel.textColor = .white titleLabel.textColor = .white // случайныйЦвет = UIColor(красный: 0,1, зеленый: 0,1, синий: 0,1, альфа: 1) случайный цвет = .черный } } частная функция resetCellSize (at indexPath: IndexPath) { если пусть ячейка = tableView.cellForRow(at: indexPath) { UIView.animate(withDuration: 0,2) { ячейка.transform = CGAffineTransform.identity } } } частная функция resetButtonSize(){ UIView.animate(withDuration: 0,1) { self.createNoteButton.transform = CGAffineTransform.identity } } //МАРК: функции @objc @objc func optionsButtonTapped() { пусть settingsVC = SettingsController() settingsVC.modalPresentationStyle = .fullScreen settingsVC.mainVC = сам присутствует (настройкиVC, анимация: true) // settingsVC.dismissAction = { [weak self] in } } @objc func handleLongPressButton (жест: UILongPressGestureRecouncer) { если жест.состояние == .began { UIView.animate(withDuration: 0,1) { self.createNoteButton.transform = CGAffineTransform(scaleX: 0,90, y: 0,90) } } else if жест.state == .ended || жест.состояние == .отменено{ сбросButtonSize() } } @objc func handleLongPressCell (жест: UILongPressGestureRecouncer) { let point = жест.location(in: tableView) если пусть indexPath = tableView.indexPathForRow(at: point) { переключить жест.state { дело .начало: если пусть ячейка = tableView.cellForRow(at: indexPath) { UIView.animate(withDuration: 0,1) { cell.transform = CGAffineTransform(scaleX: 0,97, y: 0,97) } } дело .закончено, .изменено: сбросCellSize (в: indexPath) по умолчанию: перерыв } } } // ОТМЕТКА: настройки tavleView func tableView (_ tableView: UITableView, раздел NumberOfRowsInSection: Int) -> Int { вернуть 1 } func numberOfSections (в tableView: UITableView) -> Int { вернуть fetchedNotes.count } func DidRequestDelete (_ ячейка: TableViewCell) { Guard let indexPath = tableView.indexPath(for: cell) else {return} self.deleteNoteAtIndexPath(indexPath) } func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { Guard let Cell = tableView.dequeueReusableCell (withIdentifier: «TableViewCell», for: indexPath) как? TableViewCell еще { вернуть UITableViewCell() } ячейка.делегат = сам cell.contentView.backgroundColor = self.randomColor cell.contentView.layer.borderColor = self.createNoteButton.tintColor.cgColor cell.titleLabel.textColor = self.randomLabel.textColor cell.noteLabel.textColor = self.randomLabel.textColor cell.deleteButton.backgroundColor = self.createNoteButton.tintColor let note = fetchedNotes[indexPath.section] cell.configure(с: примечанием) возвратная ячейка } func tableView (_ tableView: UITableView, раздел viewForFooterInSection: Int) -> UIView? { пусть просмотр = UIView() view.backgroundColor = .clear обратный вид } func tableView (_ tableView: UITableView, раздел heightForFooterInSection: Int) -> CGFloat { вернуть cellSpacing } // ОТМЕТКА: DidSelectRowAt func tableView (_ tableView: UITableView, DidSelectRowAt indexPath: IndexPath) { tableView.reloadRows(at: [indexPath], с: .none) если пусть ячейка = tableView.cellForRow(at: indexPath) { let анимация = CABasicAnimation(keyPath: "transform.scale") анимация.fromValue = 1,0 анимация.toValue = 0,92 анимация.длительность = 0,10 анимация.autoreverses = правда анимация.repeatCount = 1 cell.layer.add(анимация, forKey: «отскок») } пусть noteDetailVC = NoteDetailViewController() // Примечание: не используется NoteDetailViewController пусть selectedNote = fetchedNotes[indexPath.section] noteDetailVC.note = выбранноеПримечание noteDetailVC.noteContent = selectedNote.text noteDetailVC.titleContent = selectedNote.title noteDetailVC.dateContent = selectedNote.date noteDetailVC.timeContent = selectedNote.time noteDetailVC.view.backgroundColor = self.view.backgroundColor noteDetailVC.textView.backgroundColor = self.view.backgroundColor noteDetailVC.titleLabel.textColor = self.randomLabel.textColor noteDetailVC.textView.textColor = self.randomLabel.textColor noteDetailVC.backMarkItem.tintColor = createNoteButton.tintColor noteDetailVC.checkMarkItem.tintColor = createNoteButton.tintColor noteDetailVC.redoButton.tintColor = createNoteButton.tintColor noteDetailVC.undoButton.tintColor = createNoteButton.tintColor noteDetailVC.encryptMarkItem.tintColor = createNoteButton.tintColor noteDetailVC.specialButton.backgroundColor = createNoteButton.tintColor noteDetailVC.dismissAction = { [слабое я] в // Kullanıcı notu tamamen silip geri döndüğünde ilgili notu sil если let newNote = noteDetailVC.noteContent, newNote.isEmpty, let newTitle = noteDetailVC.titleContent, newTitle.isEmpty { // Not silme fonksiyonunu çağır self?.deleteNoteAtIndexPath(indexPath) } еще { // Not güncellendiyse veya değişiklik olmadıysa güncellemeleri kaydet если let newNote = noteDetailVC.noteContent, !newNote.isEmpty, let newTitle = noteDetailVC.titleContent, !newTitle.isEmpty { // Yeni bir Core Data nesnesi oluştur ve kaydet } // Notları tekrar çekmek için fetchNotes çağrılabilir себя?.fetchNotes() } } пусть NavigationController = UINavigationController (rootViewController: noteDetailVC) NavigationController.modalPresentationStyle = .fullScreen присутствует (navigationController, анимированный: true) } } введите здесь
Я создал кнопку удаления для просмотра таблицы, которая открывается при пролистывании жестом панорамирования. я мог бы сделать это с помощью UIContextualAction, но не могу настроить внешний вид кнопки. поэтому я решил сделать кнопку сам. созданная мной функция панорамирования также работала, но есть проблема. когда я удерживаю ячейку (длительное нажатие), пока ячейка прокручивается влево, ячейка мгновенно возвращается в предыдущее состояние. как я могу это предотвратить? есть два класса, связанных с этой темой: TableViewCell и ViewController
вот мой класс TableViewCell
импортировать UIKit импортировать CoreData протокол TableViewCellDelegate: AnyObject { func DidRequestDelete (_ ячейка: TableViewCell) } класс TableViewCell: UITableViewCell { пусть titleLabel = UILabel() пусть noteLabel = UILabel() пусть dateLabel = UILabel() пусть timeLabel = UILabel() пусть dateFormatter = DateFormatter() пусть timeFormatter = DateFormatter() пусть deleteButton = UIButton() слабый делегат var: TableViewCellDelegate? переопределить init(стиль: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(стиль: стиль, reuseIdentifier: reuseIdentifier) dateFormatter.dateFormat = "дд/мм/гггг" timeFormatter.dateFormat = "ЧЧ:мм" выборСтиль = .none настройкаDeleteButton() contentView.layer.cornerRadius = 15 contentView.layer.borderWidth = 2 contentView.clipsToBounds = ложь фонЦвет = UIColor.clear backgroundView?.backgroundColor = UIColor.clear selectedBackgroundView?.backgroundColor = UIColor.clear setLabel (метка: titleLabel, textColor: .systemGray5, FontSize: 22, NumberOfLine: 0).isEnabled = false setLabel (метка: noteLabel, textColor: .systemGray5, FontSize: 18, NumberOfLine: 3).isHidden = false setLabel (метка: dateLabel, textColor: .systemGray, FontSize: 14, NumberOfLine: 1).isHidden = false setLabel (метка: timeLabel, textColor: .systemGray, FontSize: 14, NumberOfLine: 1).isHidden = false addContentView (просмотры: [titleLabel, noteLabel, dateLabel, timeLabel]) пусть colorIndex = UserDefaults.standard.integer(forKey: "index") setupBasedOnColors (индекс: colorIndex) настройкаConstraints() let leftSwipeGesture = UIPanGestureRecouncer(target: self, action: #selector(handleLeftSwipe(_:))) contentView.addGestureRecouncer(leftSwipeGesture) let TapGesture = UITapGestureRecouncer(target: self, action: #selector(handleCellTap(_:))) TapGesture.delegate = сам contentView.addGestureRecouncer(tapGesture) } требуется инициализация?(кодер aDecoder: NSCoder) { FatalError("init(coder:) не реализован") } переопределить func hitTest (_ точка: CGPoint, с событием: UIEvent?) -> UIView? { пусть pointForTargetView = deleteButton.convert(point, from: self) если deleteButton.bounds.contains(pointForTargetView) { вернуть кнопку удаления } вернуть super.hitTest(точка, с: событием) } функция setupBasedOnColors (индекс: Int) { индекс переключения { случай 0: contentView.layer.borderColor = UIColor(красный: 0,7, зеленый: 0,7, синий: 0,7, альфа: 1).cgColor Дело 1: contentView.layer.borderColor = UIColor.systemPink.cgColor случай 2: contentView.layer.borderColor = UIColor.systemGray3.cgColor случай 3: contentView.layer.borderColor = UIColor.systemBlue.cgColor случай 4: contentView.layer.borderColor = UIColor.systemYellow.cgColor случай 5: contentView.layer.borderColor = UIColor(красный: 0,3, зеленый: 0,3, синий: 0,3, альфа: 1).cgColor по умолчанию: print("Рэнк Булунамады") } contentView.setNeedsDisplay() } функция setupDeleteButton(){ contentView.addSubview(deleteButton) deleteButton.setImage(UIImage(systemName: «trash»), для: .normal) deleteButton.layer.cornerRadius = 15 deleteButton.tintColor = .white deleteButton.addTarget(self, действие: #selector(deleteButtonTapped), для: .touchUpInside) deleteButton.isUserInteractionEnabled = true } func setLabel (метка: UILabel, textColor: UIColor, fontSize: CGFloat, NumberOfLine: Int) -> UILabel { label.textColor = цвет текста label.font = UIFont.systemFont(ofSize: fontSize) label.numberOfLines = число_строки возвратная этикетка } func addContentView (просмотры: [UILabel]) { views.forEach { просмотр в contentView.addSubview(представление) } } частная функция setupConstraints() { titleLabel.translatesAutoresizingMaskIntoConstraints = false noteLabel.translatesAutoresizingMaskIntoConstraints = false dateLabel.translatesAutoresizingMaskIntoConstraints = false timeLabel.translatesAutoresizingMaskIntoConstraints = false deleteButton.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ titleLabel.topAnchor.constraint(equalTo: contentView.topAnchor, константа: 10), titleLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, константа: 10), titleLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, константа: -10), deleteButton.leadingAnchor.constraint(equalTo: contentView.trailingAnchor, константа: 6), deleteButton.topAnchor.constraint(equalTo: contentView.topAnchor), deleteButton.bottomAnchor.constraint(equalTo: contentView.bottomAnchor), deleteButton.widthAnchor.constraint(equalToConstant: 100), noteLabel.topAnchor.constraint(equalTo: titleLabel.bottomAnchor, константа: 5), noteLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, константа: 10), noteLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, константа: -10), noteLabel.bottomAnchor.constraint(equalTo: dateLabel.topAnchor, константа: -10), dateLabel.topAnchor.constraint(equalTo: noteLabel.bottomAnchor, константа: 10), dateLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, константа: 10), dateLabel.trailingAnchor.constraint(equalTo: timeLabel.leadingAnchor, константа: -15), dateLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, константа: -10), timeLabel.topAnchor.constraint(equalTo: dateLabel.topAnchor), timeLabel.leadingAnchor.constraint(equalTo: dateLabel.trailingAnchor, константа: 20), timeLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, константа: -9) ]) } func configure (с примечанием: NoteText) { titleLabel.text = note.title noteLabel.text = note.text если пусть дата = note.date { timeLabel.text = timeFormatter.string(от: дата) } еще { timeLabel.text = "Нет времени" } если пусть дата = note.date { configureCellDateLabel (с: датой) } еще { dateLabel.text = "Нет даты" } } func configureCellDateLabel (с датой: Дата) { пусть календарь = Calendar.current если календарь.isDateInToday(дата) { dateLabel.text = "Сегодня" } еще { dateFormatter.dateFormat = "дд/мм/гггг" dateLabel.text = dateFormatter.string(от: дата) } } @objc func handleLeftSwipe (_ жест: UIPanGestureRecouncer) { пусть перевод = жест.перевод (в: contentView) если жест.состояние == .changed { пусть newPosition = max(translation.x, -(deleteButton.frame.width + 7)) если newPosition Бул { вернуть contentView.frame.origin.x != 0 } @objc func deleteButtonTapped(){ делегат?.didRequestDelete(self) } }
Я пытался добавить некоторые условия в функцию DidSelectRowAt в классе ViewController, но это не сработало.
импортировать UIKit импортировать CoreData класс ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, TableViewCellDelegate { контекст var: NSManagedObjectContext! пусть tableView = UITableView() пусть createNoteButton = UIButton() пусть cellSpacing: CGFloat = 6 var fetchedNotes: [NoteText] = [] вар titleLabel = UILabel() вар selectedIndexPath: IndexPath? вар randomLabel = UILabel() вар случайныйЦвет = UIColor() вар случайныйBool = Bool() пусть dateFormatter = DateFormatter() пусть timeFormatter = DateFormatter() ленивый вар optionsMarkItem : UIBarButtonItem = { let item = UIBarButtonItem(изображение: UIImage(systemName: "gearshape.fill"), стиль: .plain, цель: self, действие: #selector(optionsButtonTapped)) item.tintColor = .systemYellow вернуть изделие }() //МАРК: viewDidLoad переопределить функцию viewDidLoad() { супер.viewDidLoad() view.backgroundColor = .черный настройкаTableView() для семьи в UIFont.familyNames.sorted() { print("\(семья)") для имени в UIFont.fontNames(forFamilyName: Family).sorted() { print("== \(имя)") } } Guard пусть appDelegate = UIApplication.shared.delegate как? AppDelegate еще { FatalError("Невозможно получить делегат приложения") } контекст = appDelegate.persistentContainer.viewContext настройкаCreateNoteButton() RandomLabel.isHidden = правда настройкаTitleLabel() tableView.backgroundColor = .black tableView.delegate = сам tableView.dataSource = сам выборкаNotes() NavigationItem.rightBarButtonItem = optionsMarkItem let longPressGestureButton = UILongPressGestureRecouncer(цель: self, action: #selector(handleLongPressCell)) let longPressGestureCell = UILongPressGestureRecouncer(цель: self, действие: #selector(handleLongPressButton)) longPressGestureCell.minimumPressDuration = 0,2 longPressGestureButton.minimumPressDuration = 0,2 tableView.addGestureRecouncer(longPressGestureButton) createNoteButton.addGestureRecouncer(longPressGestureCell) let switchValue = UserDefaults.standard.bool(forKey: "mySwitchValue") setupUIBasedOnSwitch (switchValue: switchValue) } // ОТМЕТКА: viewWillAppear переопределить func viewWillAppear(_animated: Bool) { super.viewWillAppear(анимированный) выборкаNotes() tableView.delegate = сам tableView.dataSource = сам let switchValue = UserDefaults.standard.bool(forKey: "mySwitchValue") setupUIBasedOnSwitch (switchValue: switchValue) dateFormatter.dateFormat = "дд/мм/гггг" timeFormatter.dateFormat = "ЧЧ:мм" пусть colorIndex = UserDefaults.standard.integer(forKey: "index") setupBasedOnColors (индекс: colorIndex) } // ОТМЕТКА: UserDefaults получает функции func getIndexValue() -> Int{ пусть index = UserDefaults.standard.integer(forKey: "index") индекс возврата } //MARK: Основные данные функция fetchNotes() { пусть запрос: NSFetchRequest = ПримечаниеТекст.fetchRequest() делать { fetchedNotes = попробуйте context.fetch(запрос) } ловить { print("Не найдено: \(ошибка)") } tableView.reloadData() } func addNoteWithTitle(_ title: String, text: String, date: Date, time: Date) { пусть newNote = NoteText(контекст: контекст) newNote.title = заголовок newNote.text = текст newNote.date = дата newNote.time = дата делать { попробуйте context.save() fetchNotes() // Список списка } ловить { print("Не найдено: \(ошибка)") } } func deleteNoteAtIndexPath (_ indexPath: IndexPath) { let noteToDelete = fetchedNotes[indexPath.section] context.delete(noteToDelete) fetchedNotes.remove(в: indexPath.section) делать { попробуйте context.save() tableView.beginUpdates() tableView.deleteSections([indexPath.section], с: .automatic) tableView.endUpdates() } ловить { print("Это не так: \(ошибка)") } } //ОТМЕТКА: настройка фоновых сообщений функция setupTableView() { view.addSubview(tableView) tableView.dataSource = сам tableView.delegate = сам tableView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ tableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, константа: 20), tableView.leftAnchor.constraint(equalTo: view.leftAnchor, константа: 5), tableView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, константа: -50), tableView.rightAnchor.constraint(equalTo: view.rightAnchor, константа: -5) ]) tableView.register(TableViewCell.self, forCellReuseIdentifier: "TableViewCell") } функция setupCreateNoteButton() { view.addSubview(createNoteButton) пусть символConfiguration = UIImage.SymbolConfiguration(pointSize: 45, вес: .regular, масштаб: .default) // "+" изолируем и настраиваем эклийоруз let plusSymbol = UIImage (имя системы: «плюс», withConfiguration:symbolConfiguration) createNoteButton.setImage(plusSymbol, for: .normal) createNoteButton.tintColor = .systemYellow // "+" Меняем цвет знака на желтый // Создаем пустой кружок для кнопки createNoteButton.backgroundColor = .clear // Делаем фон кнопки прозрачным createNoteButton.layer.cornerRadius = 35 // Устанавливаем радиус кнопки createNoteButton.layer.borderWidth = 2 // Ширина границы createNoteButton.layer.borderColor = UIColor.systemYellow.cgColor createNoteButton.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ createNoteButton.heightAnchor.constraint(equalToConstant: 70), createNoteButton.widthAnchor.constraint(equalToConstant: 70), createNoteButton.rightAnchor.constraint(equalTo: view.rightAnchor, константа: -20), createNoteButton.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, константа: -55) ]) createNoteButton.addTarget(self, действие: #selector(createNoteButtonTapped), для: .touchUpInside) } функция setupTitleLabel() { titleLabel.text = "TextCrypt" titleLabel.font = UIFont(имя: «TimesNewRomanPS-BoldMT», размер: 27) titleLabel.textColor = .white NavigationItem.titleView = titleLabel } func setupUIBasedOnSwitch (switchValue: Bool) { если переключательValue { view.backgroundColor = .white tableView.backgroundColor = .white randomLabel.textColor = .черный titleLabel.textColor = .черный // randomColor = UIColor(красный: 0,9, зеленый: 0,9, синий: 0,9, альфа: 1) случайный цвет = .белый } еще { view.backgroundColor = .черный tableView.backgroundColor = .black randomLabel.textColor = .white titleLabel.textColor = .white // случайныйЦвет = UIColor(красный: 0,1, зеленый: 0,1, синий: 0,1, альфа: 1) случайный цвет = .черный } } частная функция resetCellSize (at indexPath: IndexPath) { если пусть ячейка = tableView.cellForRow(at: indexPath) { UIView.animate(withDuration: 0,2) { ячейка.transform = CGAffineTransform.identity } } } частная функция resetButtonSize(){ UIView.animate(withDuration: 0,1) { self.createNoteButton.transform = CGAffineTransform.identity } } //МАРК: функции @objc @objc func optionsButtonTapped() { пусть settingsVC = SettingsController() settingsVC.modalPresentationStyle = .fullScreen settingsVC.mainVC = сам присутствует (настройкиVC, анимация: true) // settingsVC.dismissAction = { [weak self] in } } @objc func handleLongPressButton (жест: UILongPressGestureRecouncer) { если жест.состояние == .began { UIView.animate(withDuration: 0,1) { self.createNoteButton.transform = CGAffineTransform(scaleX: 0,90, y: 0,90) } } else if жест.state == .ended || жест.состояние == .отменено{ сбросButtonSize() } } @objc func handleLongPressCell (жест: UILongPressGestureRecouncer) { let point = жест.location(in: tableView) если пусть indexPath = tableView.indexPathForRow(at: point) { переключить жест.state { дело .начало: если пусть ячейка = tableView.cellForRow(at: indexPath) { UIView.animate(withDuration: 0,1) { cell.transform = CGAffineTransform(scaleX: 0,97, y: 0,97) } } дело .закончено, .изменено: сбросCellSize (в: indexPath) по умолчанию: перерыв } } } // ОТМЕТКА: настройки tavleView func tableView (_ tableView: UITableView, раздел NumberOfRowsInSection: Int) -> Int { вернуть 1 } func numberOfSections (в tableView: UITableView) -> Int { вернуть fetchedNotes.count } func DidRequestDelete (_ ячейка: TableViewCell) { Guard let indexPath = tableView.indexPath(for: cell) else {return} self.deleteNoteAtIndexPath(indexPath) } func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { Guard let Cell = tableView.dequeueReusableCell (withIdentifier: «TableViewCell», for: indexPath) как? TableViewCell еще { вернуть UITableViewCell() } ячейка.делегат = сам cell.contentView.backgroundColor = self.randomColor cell.contentView.layer.borderColor = self.createNoteButton.tintColor.cgColor cell.titleLabel.textColor = self.randomLabel.textColor cell.noteLabel.textColor = self.randomLabel.textColor cell.deleteButton.backgroundColor = self.createNoteButton.tintColor let note = fetchedNotes[indexPath.section] cell.configure(с: примечанием) возвратная ячейка } func tableView (_ tableView: UITableView, раздел viewForFooterInSection: Int) -> UIView? { пусть просмотр = UIView() view.backgroundColor = .clear обратный вид } func tableView (_ tableView: UITableView, раздел heightForFooterInSection: Int) -> CGFloat { вернуть cellSpacing } // ОТМЕТКА: DidSelectRowAt func tableView (_ tableView: UITableView, DidSelectRowAt indexPath: IndexPath) { tableView.reloadRows(at: [indexPath], с: .none) если пусть ячейка = tableView.cellForRow(at: indexPath) { let анимация = CABasicAnimation(keyPath: "transform.scale") анимация.fromValue = 1,0 анимация.toValue = 0,92 анимация.длительность = 0,10 анимация.autoreverses = правда анимация.repeatCount = 1 cell.layer.add(анимация, forKey: «отскок») } пусть noteDetailVC = NoteDetailViewController() // Примечание: не используется NoteDetailViewController пусть selectedNote = fetchedNotes[indexPath.section] noteDetailVC.note = выбранноеПримечание noteDetailVC.noteContent = selectedNote.text noteDetailVC.titleContent = selectedNote.title noteDetailVC.dateContent = selectedNote.date noteDetailVC.timeContent = selectedNote.time noteDetailVC.view.backgroundColor = self.view.backgroundColor noteDetailVC.textView.backgroundColor = self.view.backgroundColor noteDetailVC.titleLabel.textColor = self.randomLabel.textColor noteDetailVC.textView.textColor = self.randomLabel.textColor noteDetailVC.backMarkItem.tintColor = createNoteButton.tintColor noteDetailVC.checkMarkItem.tintColor = createNoteButton.tintColor noteDetailVC.redoButton.tintColor = createNoteButton.tintColor noteDetailVC.undoButton.tintColor = createNoteButton.tintColor noteDetailVC.encryptMarkItem.tintColor = createNoteButton.tintColor noteDetailVC.specialButton.backgroundColor = createNoteButton.tintColor noteDetailVC.dismissAction = { [слабое я] в // Kullanıcı notu tamamen silip geri döndüğünde ilgili notu sil если let newNote = noteDetailVC.noteContent, newNote.isEmpty, let newTitle = noteDetailVC.titleContent, newTitle.isEmpty { // Not silme fonksiyonunu çağır self?.deleteNoteAtIndexPath(indexPath) } еще { // Not güncellendiyse veya değişiklik olmadıysa güncellemeleri kaydet если let newNote = noteDetailVC.noteContent, !newNote.isEmpty, let newTitle = noteDetailVC.titleContent, !newTitle.isEmpty { // Yeni bir Core Data nesnesi oluştur ve kaydet } // Notları tekrar çekmek için fetchNotes çağrılabilir себя?.fetchNotes() } } пусть NavigationController = UINavigationController (rootViewController: noteDetailVC) NavigationController.modalPresentationStyle = .fullScreen присутствует (navigationController, анимированный: true) } } введите здесь
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Ячейки табличного представления UITableViewController отображаются только во время отладки
Anonymous » » в форуме IOS - 0 Ответы
- 20 Просмотры
-
Последнее сообщение Anonymous
-