В Swift 5 большое спасибо @ Adrian за ответ
extension UITableView{
func hasRowAtIndexPath(indexPath: IndexPath) -> Bool {
return indexPath.section < numberOfSections && indexPath.row < numberOfRows(inSection: indexPath.section)
}
func scrollToTop(_ animated: Bool = false) {
let indexPath = IndexPath(row: 0, section: 0)
if hasRowAtIndexPath(indexPath: indexPath) {
scrollToRow(at: indexPath, at: .top, animated: animated)
}
}
}
Использование:
tableView.scrollToTop()
Да, конечно, возможно.
Вы можете разработать OPOS SO (Service Object), который реализует COM-интерфейс, ожидаемый OPOS на C #. Затем это может реализовать API любым способом.
Я предлагаю вам загрузить общие управляющие объекты OPOS Curtiss Monroe с http://monroecs.com/oposccos.htm .
Это даст Вам нужны библиотеки типов, которые необходимо реализовать для объекта (ов) службы, и, вероятно, есть ссылки на документацию OPOS. NB Я думаю, что OPOS использует позднее связывание, поэтому вам нужно будет реализовать двойной интерфейс.
Предостережение: IMHO OPOS - это технически ужасный API, разработанный комитетом поставщиков периферийных устройств, чтобы раскрыть возможности их периферийных устройств, а не предоставить полезная абстракция для разработчиков POS-приложений.
Особенно ярким примером этого является так называемое устройство ToneIndicator, которое демонстрирует возможности тон-генератора в клавиатуре Fujitsu для воспроизведения повторяющейся последовательности из двух тонов разной высоты и громкости.
ОБНОВЛЕНИЕ
Я реализовывал объекты службы OPOS и раньше, но это было давно. Вот еще некоторая информация, которая поможет вам начать работу с POSKeyboard SO.
Объект Control (CO) загрузит ваш Service Object (SO), используя позднее связывание. Фактически, вы не реализуете COM IID или библиотеку типов. Вместо этого вам нужно реализовать все необходимые методы и события, определенные в соответствующей версии спецификаций OPOS (например, в одной из документов на этой странице: http://monroecs.com/oposreleases.htm ). Приведенная ниже информация основана на Руководстве программиста управления 1.6 (CPG), ссылка на которое имеется на этой странице.
Глава 2 CPG описывает, что вам необходимо реализовать. Обратите внимание, что OPOS использует странный метод для получения / настройки свойств. В то время как объект управления (CO) предоставляет свойства с разумными именами (например, DeviceEnabled, DeviceName, DeviceDescription), все они вызывают одни и те же методы GetPropertyString (для строковых свойств) или GetPropertyNumber (для целочисленных свойств), передавая целочисленный «индекс свойства» как аргумент, определяющий, какое свойство нужно получить. Все «индексы свойств» определены в файлах заголовков, поставляемых со стандартом OPOS.
При беглом взгляде на исходный код CCO PosKeyboard, имена методов, которые необходимо реализовать, перечислены в s_SOMethodNames в исходном файле POSKeyboardImpl.cpp.
12114] Записи реестра, которые необходимо настроить, определены в OPOS Application Programmer. s Приложение к Руководству (APG) «Использование реестра OPOS». В вашем случае вам нужно будет создать раздел реестра HKLM \ OleForRetail \ ServiceOPOS \ POSKeyboard \ DefaultPOSKeyboard (где DefaultPOSKeyboard - это имя устройства, которое вы передаете в метод Open). Этот раздел реестра должен иметь значение по умолчанию, которое является ProgId вашего класса SO. Вы также можете хранить там другие значения (например, информацию о конфигурации, используемую вашим SO).
Удачи с этим - это будет болезненный процесс с большим количеством WTF.