UITableViewDelegate не нуждается в cell.delegate = self
.
Если у вас CustomTableCell есть ваш Custom Delegate
, вам нужно только назначить его. Итак, если у вас нет ant Custom Delegate
для вашего CustomTableCell
, удалите эту строку.
Для методов делегата tableView вы должны добавить это в viewDidLoad ():
yourTableView.delegate = self
yourTableView.dataSource = self
Или подключите его только с помощью StoryBorad
.
Ответа на этот вопрос: Как вы создаете делегат ячейки в классе CustomTableCell? Просто любопытно
CustomTableCell.swift:
// Custom protocol
protocol CustomCellDelegate: NSObjectProtocol {
// Protocol method
func someFunctionToPassSomeValue(name: String)
}
class CustomTableCell: UITableVieCell {
weak var delegate: CustomCellDelegate?
// Your class implementations and outlets..
//Call your protocol method in some action, for example in button action
@IBAction func buttonAction(sender: UIButton) {
delegate?.someFunctionToPassSomeValue(name: "anyStringValue")
}
}
Затем в классе ViewController
вам нужно назначить экземпляр пользовательской переменной делегата.
let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier") as! CustomTableCell
cell.delegate = self
И реализовать метод протокола:
extension ViewController: CustomCellDelegate {
func someFunctionToPassSomeValue(name: String) {
print("Delegate is working. Value : \(name)")
}
}
Благодаря М. Биллу Карвину, код стал более чистым. В течение года я изменил его на «% Y». Код теперь:
CREATE TRIGGER `update_request_missions_after_insert` BEFORE INSERT ON `request_missions`
FOR EACH ROW
BEGIN
DECLARE next_id INT;
SELECT COALESCE(MAX(id),0) + 1 INTO next_id FROM request_missions;
IF next_id BETWEEN 1 AND 9 THEN
SET NEW.rm_number = CONCAT(DATE_FORMAT(CURDATE(),'%Y'), '-', '00000', next_id);
ELSEIF next_id BETWEEN 10 AND 99 THEN
SET NEW.rm_number = CONCAT(DATE_FORMAT(CURDATE(),'%Y'), '-', '0000', next_id);
ELSEIF next_id BETWEEN 100 AND 999 THEN
SET NEW.rm_number = CONCAT(DATE_FORMAT(CURDATE(),'%Y'), '-', '000', next_id);
ELSEIF next_id BETWEEN 1000 AND 9999 THEN
SET NEW.rm_number = CONCAT(DATE_FORMAT(CURDATE(),'%Y'), '-', '00', next_id);
ELSEIF next_id BETWEEN 10000 AND 99999 THEN
SET NEW.rm_number = CONCAT(DATE_FORMAT(CURDATE(),'%Y'), '-', '0', next_id);
ELSEIF next_id BETWEEN 100000 AND 999999 THEN
SET NEW.rm_number = CONCAT(DATE_FORMAT(CURDATE(),'%Y'), '-', next_id);
END IF;
END
Предупреждение: это страдает от состояния гонки. Например, если две таблицы вставляются в таблицу одновременно, они могут прочитать один и тот же next_id.
blockquote>Есть ли решение этой проблемы, зная, что целью этого триггера является добавление числа в формате «YYYY-ID» для каждой добавленной строки. ГГГГ: идентификатор текущего года: идентификатор форматированной строки, как показано в триггере
Вот предложение по использованию локальной переменной вместо повторения вашего подзапроса три раза. Вы сказали, что это ваша забота.
CREATE TRIGGER `update_request_missions_after_insert` BEFORE INSERT ON `request_missions`
FOR EACH ROW
BEGIN
DECLARE next_id INT;
SELECT COALESCE(MAX(id),0) + 1 INTO next_id FROM request_missions;
IF next_id BETWEEN 1 AND 9 THEN
SET NEW.rm_number = CONCAT(DATE_FORMAT(CURDATE(),'%y'), '-', '00000', next_id);
END IF;
END
Предупреждение: это страдает от состояния гонки. Например, если два сеанса вставляются в таблицу одновременно, они могут оба читать одно и то же next_id
.
Также, как @ P.Salmon прокомментировал выше, результаты не определены, если next_id
> 9. Я не уверен, что вы пытаетесь сделать.
Возможно, вы захотите разрешить более длинные числа и дополнить их фиксированной длиной нулями:
LPAD(next_id, 6, '0')
См. Руководство по функции LPAD () . [ 1123]
Я использовал COALESCE(MAX(id),0)
, чтобы убедиться, что по крайней мере одно возвращаемое значение, отличное от NULL, в случае, если таблица содержит ноль строк.
Это также касается:
DATE_FORMAT(CURDATE(),'%y')
Год из двух цифр перенесется на 00
через 81 год. Именно так и была создана проблема Y2K! Я знаю, что к тому времени вы не будете работать над кодом, поэтому вам может быть все равно. Но вы всегда должны кодировать так, как будто человек, который в конечном итоге поддерживает ваш код, является жестоким психопатом, который знает, где вы живете.
Ваш новый код опубликован в другом ответе:
Это лучшее решение для обработки чисел next_id до 999 999.
CREATE TRIGGER `update_request_missions_after_insert` BEFORE INSERT ON `request_missions`
FOR EACH ROW
BEGIN
DECLARE next_id INT;
SELECT COALESCE(MAX(id),0) + 1 INTO next_id FROM request_missions;
IF next_id < 1000000 THEN
SET NEW.rm_number = CONCAT(DATE_FORMAT(CURDATE(),'%y'), '-', LPAD(next_id, 6, '0'));
ELSE
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'RM Number has reached capacity'
END IF;
END
Проблема состояния гонки отличается, и пока вы не используете MAX(id)
, чтобы найти последний идентификатор, решения не существует. Проблема в том, что у вас может быть несколько клиентов, одновременно вставляющих в таблицу. Каждый сеанс клиента будет читать одно и то же значение для MAX(id)
и использовать его.
Вы должны прочитать о Расовых условиях .
Что вам действительно нужно, так это какой-то способ использования значения AUTO_INCREMENT
, которое генерирует новые уникальные значения в поточно-ориентированном виде, и копирует значение в ваш rm_number
.
К сожалению, нет способа сделать это в триггере. Во время триггера BEFORE INSERT новое значение AUTO_INCREMENT еще не генерируется. Во время триггера AFTER INSERT вы не можете изменить NEW.rm_number
, потому что вставка уже сделана. В прошлом я писал об этом: