Так что, похоже, нет простого способа сделать прокрутку UITableViewController в горизонтальном направлении. Под горизонтальной прокруткой я подразумеваю поддерживать вертикальную прокрутку И добавить возможность горизонтальной прокрутки для просмотра элементов UITableViewCell, чьи элементы данных шире экрана, и для прокрутки всей таблицы в виде связной таблицы. Я не хочу поворачивать UITableView на 90 градусов, чтобы он прокручивался по горизонтали за счет прокрутки по вертикали, и я не хочу прокручивать данные в каждой ячейке по отдельности. Решение для UITableView, с которым я столкнулся, больше всего походило на то, о чем я говорю, это здесь , но я не реализовывал это решение. Вместо этого я изменил весь свой подход и удалил кучу кода. Поскольку я отображал электронную таблицу как данные, я создал файл CSV и открыл его с помощью Quick Look QLPreviewController. Он открывает файл и обеспечивает как вертикальную, так и горизонтальную прокрутку, и позволяет пользователю сохранять или делиться или отправлять по электронной почте файл, который был чем-то еще, что мне нужно было реализовать, поэтому это решение убило общеизвестных 2 птиц одним камнем, и это было довольно просто.
В моем контроллере представления я импортировал QuickLook.h и принял протокол.
#import <UIKit/UIKit.h>
#import <QuickLook/QuickLook.h>
@interface MyTableViewController : UITableViewController <QLPreviewControllerDataSource>
@end
Я объявляю 2 свойства в моем контроллере представления
@interface TimersTableViewController ()
@property NSString *csvFile;
@property QLPreviewController *qlController;
@end
Реализация протокола в моем контроллере:
// quick look preview controller protocol methods. there is only one file and it is the csv file
// this controller will allow the use to decide what they want to do with the file. DML 11/21/2019
- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller {
return 1;
}
- (id <QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index {
return [NSURL fileURLWithPath:self.csvFile];
}
Затем я записал свои данные вфайл и вызывается QLPreviewController для его отображения.
- (void)setLogs:(NSArray<LogRecords *> *)logs{
_logs = logs;
// allocate the quick look preview controller to display the csv file.
if (self.qlController == nil){
self.qlController = [[QLPreviewController alloc] init];
// set self as it's datasource
self.qlController.dataSource = self;
}
// get the path to the NSDocumentDirectory which
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// the path I want is the first object in the array
NSString *documentsDirectory = [paths objectAtIndex:0];
// set the cvs file name
self.csvFile = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"MyCSVFile.csv"];
// use NSFileManaget to create the file because it needs to exist before it can be opened with NSFileHandle
NSFileManager *fm = [NSFileManager defaultManager];
[fm createFileAtPath:self.csvFile contents:nil attributes:nil];
NSFileHandle *file = [NSFileHandle fileHandleForWritingAtPath:self.csvFile];
// write the header to the csv file
[file writeData:[@"date,time,message" dataUsingEncoding:NSUTF8StringEncoding]];
// for my app I loop through the logs and write each of them to the file
for (int i = 0; i < self.logs.count; i++){
[file writeData:[[[self.logs objectAtIndex:i] toCsvString] dataUsingEncoding:NSUTF8StringEncoding]];
}
[file closeFile];
// make sure quick look preview controller gets latest csvFile
[self.qlController reloadData];
// display the quick look preview controller
[self presentViewController:self.qlController animated:YES completion:nil];
}
Это решило обе мои проблемы одновременно: горизонтальная прокрутка и предоставление пользователю доступа к файлу, чтобы сохранить или поделиться им.