Существует ли способ удалить строку разделителя из UITableView?

Принятый ответ предоставляет отличную ссылку на эту тему; однако, согласно правилам SO, следует избегать чистых ссылок, поскольку они могут исчезнуть в любое время. По этой причине я нашел время, чтобы обобщить содержание ссылки для будущих читателей.


Начало работы

Прежде чем внедрять метод загрузки файлов на свой веб-сайт, вы должны убедиться, что браузеры, которые вы выбираете для поддержки, будут в состоянии полностью поддерживать File API ]. Вы можете быстро проверить это с помощью фрагмента Javascript ниже:

// Check for the various File API support.
if (window.File && window.FileReader && window.FileList && window.Blob) {
  // Great success! All the File APIs are supported.
} else {
  alert('The File APIs are not fully supported in this browser.');
}

Вы можете изменить приведенный выше фрагмент, чтобы, конечно, удовлетворить ваши потребности.


Ввод формы

Самый распространенный способ загрузки файла - использовать стандартный элемент . JavaScript возвращает список выбранных объектов File как FileList.

  function handleFileSelect(evt) {
    var files = evt.target.files; // FileList object

    // files is a FileList of File objects. List some properties.
    var output = [];
    for (var i = 0, f; f = files[i]; i++) {
      output.push('
  • ', escape(f.name), ' (', f.type || 'n/a', ') - ', f.size, ' bytes, last modified: ', f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a', '
  • '); } document.getElementById('list').innerHTML = '
      ' + output.join('') + '
    '; } document.getElementById('files').addEventListener('change', handleFileSelect, false);
    
    

    Перетаскивание

    Внесение простых изменений в приведенный выше фрагмент кода позволяет нам предоставить поддержка перетаскивания.

      function handleFileSelect(evt) {
        evt.stopPropagation();
        evt.preventDefault();
    
        var files = evt.dataTransfer.files; // FileList object.
    
        // files is a FileList of File objects. List some properties.
        var output = [];
        for (var i = 0, f; f = files[i]; i++) {
          output.push('
  • ', escape(f.name), ' (', f.type || 'n/a', ') - ', f.size, ' bytes, last modified: ', f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a', '
  • '); } document.getElementById('list').innerHTML = '
      ' + output.join('') + '
    '; } function handleDragOver(evt) { evt.stopPropagation(); evt.preventDefault(); evt.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy. } // Setup the dnd listeners. var dropZone = document.getElementById('drop_zone'); dropZone.addEventListener('dragover', handleDragOver, false); dropZone.addEventListener('drop', handleFileSelect, false);
    Drop files here

    Чтение файлов

    Теперь вы получили ссылку на File Вы можете создать экземпляр FileReader для чтения его содержимого в память. Когда загрузка завершается, вызывается событие onload, и его атрибут result может использоваться для доступа к данным файла. Не стесняйтесь смотреть ссылки на FileReader, чтобы охватить четыре доступных варианта для чтения файла.

    В приведенном ниже примере отфильтровываются изображения по выбору пользователя, вызывается reader.readAsDataURL() для файла и отображается миниатюра путем установки атрибута src для URL-адреса данных.

      function handleFileSelect(evt) {
        var files = evt.target.files; // FileList object
    
        // Loop through the FileList and render image files as thumbnails.
        for (var i = 0, f; f = files[i]; i++) {
    
          // Only process image files.
          if (!f.type.match('image.*')) {
            continue;
          }
    
          var reader = new FileReader();
    
          // Closure to capture the file information.
          reader.onload = (function(theFile) {
            return function(e) {
              // Render thumbnail.
              var span = document.createElement('span');
              span.innerHTML = [''].join('');
              document.getElementById('list').insertBefore(span, null);
            };
          })(f);
    
          // Read in the image file as a data URL.
          reader.readAsDataURL(f);
        }
      }
    
      document.getElementById('files').addEventListener('change', handleFileSelect, false);
      .thumb {
        height: 75px;
        border: 1px solid #000;
        margin: 10px 5px 0 0;
      }
    
    

    Нарезка

    В некоторых случаях чтение всего файла в память не выполняется. не лучший вариант. Например, допустим, вы хотите написать загрузчик асинхронных файлов. Одним из возможных способов ускорить загрузку было бы чтение и отправка файла в отдельных блоках диапазона байтов. Серверный компонент будет тогда отвечать за восстановление содержимого файла в правильном порядке.

    Следующий пример демонстрирует чтение фрагментов файла. Стоит отметить, что он использует onloadend и проверяет evt.target.readyState вместо использования события onload.

      function readBlob(opt_startByte, opt_stopByte) {
    
        var files = document.getElementById('files').files;
        if (!files.length) {
          alert('Please select a file!');
          return;
        }
    
        var file = files[0];
        var start = parseInt(opt_startByte) || 0;
        var stop = parseInt(opt_stopByte) || file.size - 1;
    
        var reader = new FileReader();
    
        // If we use onloadend, we need to check the readyState.
        reader.onloadend = function(evt) {
          if (evt.target.readyState == FileReader.DONE) { // DONE == 2
            document.getElementById('byte_content').textContent = evt.target.result;
            document.getElementById('byte_range').textContent = 
                ['Read bytes: ', start + 1, ' - ', stop + 1,
                 ' of ', file.size, ' byte file'].join('');
          }
        };
    
        var blob = file.slice(start, stop + 1);
        reader.readAsBinaryString(blob);
      }
      
      document.querySelector('.readBytesButtons').addEventListener('click', function(evt) {
        if (evt.target.tagName.toLowerCase() == 'button') {
          var startByte = evt.target.getAttribute('data-startbyte');
          var endByte = evt.target.getAttribute('data-endbyte');
          readBlob(startByte, endByte);
        }
      }, false);
      #byte_content {
        margin: 5px 0;
        max-height: 100px;
        overflow-y: auto;
        overflow-x: hidden;
      }
      #byte_range { margin-top: 5px; }
     Read bytes: 
    
      
      
      
      
    
    

    Мониторинг прогресса

    Одна из приятных вещей, которые мы получаем за бесплатно при использовании асинхронной обработки событий есть возможность следить за ходом чтения файла; полезно для больших файлов, выявления ошибок и выяснения, когда чтение завершено.

    События onloadstart и onprogress могут использоваться для отслеживания хода чтения.

    Пример ниже демонстрирует отображение индикатора выполнения для контроля состояния чтения. Чтобы увидеть индикатор прогресса в действии, попробуйте большой файл или файл с удаленного диска.

      var reader;
      var progress = document.querySelector('.percent');
    
      function abortRead() {
        reader.abort();
      }
    
      function errorHandler(evt) {
        switch(evt.target.error.code) {
          case evt.target.error.NOT_FOUND_ERR:
            alert('File Not Found!');
            break;
          case evt.target.error.NOT_READABLE_ERR:
            alert('File is not readable');
            break;
          case evt.target.error.ABORT_ERR:
            break; // noop
          default:
            alert('An error occurred reading this file.');
        };
      }
    
      function updateProgress(evt) {
        // evt is an ProgressEvent.
        if (evt.lengthComputable) {
          var percentLoaded = Math.round((evt.loaded / evt.total) * 100);
          // Increase the progress bar length.
          if (percentLoaded < 100) {
            progress.style.width = percentLoaded + '%';
            progress.textContent = percentLoaded + '%';
          }
        }
      }
    
      function handleFileSelect(evt) {
        // Reset progress indicator on new file selection.
        progress.style.width = '0%';
        progress.textContent = '0%';
    
        reader = new FileReader();
        reader.onerror = errorHandler;
        reader.onprogress = updateProgress;
        reader.onabort = function(e) {
          alert('File read cancelled');
        };
        reader.onloadstart = function(e) {
          document.getElementById('progress_bar').className = 'loading';
        };
        reader.onload = function(e) {
          // Ensure that the progress bar displays 100% at the end.
          progress.style.width = '100%';
          progress.textContent = '100%';
          setTimeout("document.getElementById('progress_bar').className='';", 2000);
        }
    
        // Read in the image file as a binary string.
        reader.readAsBinaryString(evt.target.files[0]);
      }
    
      document.getElementById('files').addEventListener('change', handleFileSelect, false);
      #progress_bar {
        margin: 10px 0;
        padding: 3px;
        border: 1px solid #000;
        font-size: 14px;
        clear: both;
        opacity: 0;
        -moz-transition: opacity 1s linear;
        -o-transition: opacity 1s linear;
        -webkit-transition: opacity 1s linear;
      }
      #progress_bar.loading {
        opacity: 1.0;
      }
      #progress_bar .percent {
        background-color: #99ccff;
        height: auto;
        width: 0;
      }
    
    
    
    0%

    222
    задан Antti Haapala 25 December 2017 в 05:08
    поделиться

    2 ответа

    Это можно сделать с помощью свойства UITableView separatorStyle . Убедитесь, что для свойства установлено значение UITableViewCellSeparatorStyleNone и все готово.

    Objective-C

    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    

    В Swift (до 3)

    tableView.separatorStyle = .None
    

    В Swift 3/4/5

    tableView.separatorStyle = .none
    
    454
    ответ дан 23 November 2019 в 04:01
    поделиться
    - (void)viewDidLoad {
        [super viewDidLoad];
        [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
    }
    
    62
    ответ дан 23 November 2019 в 04:01
    поделиться