Отображение вида изображения в виде таблицы условно в Swift - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь отобразить изображение в виде ячейки табличного представления при условии логического значения.

Логическое значение представляет собой представление состояния объекта класса «Книга», в котором объекты инициализируются:

class Book: NSObject, Codable {
    @objc dynamic var author: String
    @objc dynamic var title: String
    @objc dynamic var lentBy: String
    @objc dynamic var available: Bool {
        if lentBy == "" {
            return true
        } else {return false}
    }

    init(author: String, title: String, lentBy: String) {
        self.author = author
        self.title = title
        self.lentBy = lentBy

    }
}

Если строка lentBy не указана, Boolavailable возвращает истину: никто не одолжил книгу и, следовательно, она должна быть доступна.Привязывая объект available к табличному представлению, соответствующая ячейка табличного представления отображает либо 1, либо 0. Вместо 1 или 0 мне бы хотелось, чтобы оно отображало изображение: NSStatusAvailable или NSStatusUnavailable.

Взгляните на это: https://i.imgur.com/xkp0znT.png. Если текстовое поле "Geliehen von" (предоставлено) пусто, статус равен 1 и должен отображать зеленый кружок;в противном случае красный круг.Зеленый кружок, который вы видите сейчас, просто перетаскивается в представление ячейки таблицы и не работает.Но это идея.

Теперь мне интересно, как отобразить соответствующее представление изображения вместо Bool 1 или 0.

Представление таблицы построено с помощью построителя интерфейса в раскадровке.Если я пытаюсь внести изменения в него программно, в табличном представлении больше ничего не отображается.Я полагаю, это связано с установленными привязками.Удаление привязок только для последнего столбца не работает.Вот как я это попробовал (без реализации представления изображения; я не знаю, как это сделать программно):

    func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
        if tableColumn == tableView.tableColumns[2] {
            let cellIdentifier = "statusCellID"
            let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: cellIdentifier), owner: self) as? NSTextField

            if let cell = cell {
                cell.identifier = NSUserInterfaceItemIdentifier(rawValue: cellIdentifier)
                cell.stringValue = books[row].lentBy
            }
            return cell
        }
        return nil
    }

Какое лучшее решение для этого?Могу ли я как-нибудь вместо Bool напрямую вернуть соответствующие, например, типы CGImage для lentBy s представления available?

1 Ответ

1 голос
/ 13 мая 2019

Вы используете привязки какао. Это очень просто.

  • В Интерфейсном Разработчике перетащите NSTableCellView с изображением в последний столбец и удалите текущий.
  • Удалите текстовое поле и установите соответствующие ограничения для вида изображения.
  • Вместо viewForColumn:Row орудия

    func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? {
        return books[row]
    }
    
  • Расширение модели со свойством image, которое определяется KVO

    class Book: NSObject, Codable {
            @objc dynamic var author: String
            @objc dynamic var title: String
            @objc dynamic var lentBy: String
    
            @objc dynamic var available: Bool {
                return lentBy.isEmpty
            }
    
            @objc dynamic var image: NSImage {
                return NSImage(named: (lentBy.isEmpty) ? NSImage.statusAvailableName : NSImage.statusUnavailableName)!
            }
    
            static func keyPathsForValuesAffectingImage() -> Set<String> { return ["lentBy"] }
    
            init(author: String, title: String, lentBy: String) {
                self.author = author
                self.title = title
                self.lentBy = lentBy
    
            }
        }
    
  • В Интерфейсном Разработчике свяжите Value представления изображения представления ячейки таблицы с Table Cell View> objectValue.image

...