2015-07-29 1 views
1

Название в основном говорит все.Как скрыть элементы панели инструментов, когда UITableView находится в режиме редактирования? (Swift)

У меня есть UITableView, и я хочу, чтобы элемент RightBarButtonItem исчез, а UITableView находится в режиме редактирования. К сожалению, все ответы, которые я нашел до сих пор, предлагают установить кнопку на ноль ... что не будет работать для меня, потому что я не хочу избавляться от кнопки и ссылки на нее, просто спрячь ее, пока UITableView находится в режиме редактирования.

Что у меня возникают проблемы выяснить, что делать, то есть:

  1. Detect, когда UITableView вошел в режим редактирования
  2. Сокрытие RightBarButtonItem (не снимая его полностью)
  3. Detect когда UITableView оставил режим редактирования (так что кнопка может снова появиться)

Любая помощь будет оценена, спасибо!

ответ

0

Вы можете использовать дополнительный метод источника данных для обнаружения, когда строка редактируются, tableView(_:canEditRowAtIndexPath:)

И внутри этого метода, вы можете скрыть или отключить элемент кнопки бара (отключение, вероятно, дружелюбнее, что нужно сделать, с точки зрения пользовательского интерфейса и кода). На кнопке бара нет свойства hidden, поэтому для правильного скрытия это означает, что you potentially do some grody coding временно удалить или заставить его исчезнуть.

В любом случае, я предлагаю что-то вроде:

func tableView(tableView: UITableView!, canEditRowAtIndexPath indexPath: NSIndexPath!) -> Bool { 
    self.navigationItem.rightBarButtonItem.enabled = false 
    return true 
} 
+0

Благодарим Вас за быстрое решение! Отключение кнопки будет работать так же хорошо. Тем не менее, есть одна проблема с методом tableView (_: willBeginEditingRowAtIndexPath :): единственный раз, когда моя кнопка отключена, - это когда я перемещаю строку, чтобы отредактировать (удалить) ее ...кнопка не отключается, когда нажимается кнопка «Редактировать» (которая также помещает UITableView в режим редактирования). – SwiftHacker

+0

Да, когда вызывается метод 'willBeginEditingRowAtIndexPath', это когда вы действительно начинаете редактировать строку. Чтобы поймать его раньше, [нам нужно реализовать метод источника данных таблицы] (http://stackoverflow.com/questions/1776045/how-to-detect-edit-mode-on-iphone-uitableview). –

+0

Отлично, это помогло. Я отправлю свое окончательное решение ниже для тех, кому это нужно. – SwiftHacker

4

рабочего раствора My для тех, кто нуждается в ней:

override func setEditing(editing: Bool, animated: Bool) { 
    if (editing) { 
     super.setEditing(true, animated: true) 
     self.navigationItem.rightBarButtonItem!.enabled = false 
    } else { 
     super.setEditing(false, animated: true) 
     self.navigationItem.rightBarButtonItem!.enabled = true 
    } 
} 

Убедитесь, чтобы установить super.setEditing до и после редактирования начинается с того, чтобы сохранить функциональность кнопки редактирования.

Кроме того, если вы не хотите UITableView оставаться в режиме редактирования, когда пользователь покидает UITableView и не щелкает «сделал» первый, добавьте следующую функцию:

override func viewWillDisappear(animated: Bool) { 
    super.viewWillDisappear(true) 
    if (editing) { 
     editing = false 
    } 
} 
1

я имел с двумя разными кнопками, которые мне нужно было скрыть и показать на некоторых условиях. Сначала была кнопка «edit», чтобы войти в режим редактирования на моем представлении, а вторая была «сделана», чтобы сохранить изменения. Поэтому они должны казаться взаимозаменяемыми.

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

extension UINavigationItem { 

    func deleteFromRightBar(item: UIBarButtonItem) { 
    // make sure item is present 
    guard let itemIndex = self.rightBarButtonItems?.index(of: item) else { 
     return 
    } 
    // remove item 
    self.rightBarButtonItems?.remove(at: itemIndex) 
    } 

    func addToRightBar(item: UIBarButtonItem) { 
    // make sure item is not present 
    guard self.rightBarButtonItems?.index(of: item) == nil else { 
     return 
    } 
    // add item 
    self.rightBarButtonItems?.append(item) 
    } 
} 

Я использовал эти методы, как, что

navigationItem.deleteFromRightBar(item: doneButton) 
navigationItem.addToRightBar(item: editButton)