2015-04-15 3 views
1

назад я успешно обнаружить, если пользователь нажал на кнопку назад, используя следующий код:Swift добавить действие, если пользователь нажимает кнопку

override func viewWillDisappear(animated: Bool) { 
    let viewControllers: NSArray = self.navigationController?.viewControllers as! NSArray 
    if viewControllers.indexOfObject(self) == NSNotFound { 
     self.navigationController?.setNavigationBarHidden(true, animated: true) 
    } 

    super.viewWillDisappear(animated) 
} 

, но я получаю следующее предупреждение:

отлиты из «[ AnyObject]? к несвязанному типу «NSArray» всегда не удается

Есть ли способ «более аккуратного» для этого?

ответ

2

Вместо NSArray, вы должны использовать Swift массив - [UIViewController]

Исправлена ​​ошибка:

override func viewWillDisappear(animated: Bool) { 
     let viewControllers: [UIViewController] = self.navigationController?.viewControllers as [UIViewController] 

     if let index = find(viewControllers, self) 
     { 
      //your object exists in that is at index 

     } 
     else 
     { 
      //your object is not in the navigation controller 
      self.navigationController?.setNavigationBarHidden(true, animated: true) 
     } 

    super.viewWillDisappear(animated) 
} 

Вместо if let else , вы можете использовать:

if find(viewControllers, self) == nil 
{ 
    //your object isnt in the viewControllers array 

} 
+0

пробовал весь метод, я думаю, что это лучший ответ! Спасибо за помощь !!! –

+0

Это не сработает. В Swift, navigationController.viewControllers всегда будут содержать self. – mbeaty

+0

Существует гораздо более простой способ, чем смотреть на контроллеры представлений внутри 'viewWillDisappear'. Вызов 'isBeingDismissed' внутри' viewWillDisappear'. – rmaddy

0

В основном проблема заключается в том, что вы пытаетесь применить к массиву object-c, NSArray. Swift использует Array вместо NSArray/NSMutableArray. Если вы хотите использовать массивы в Swift, вы должны указать тип объекта внутри массива. Таким образом, следующий код:

let viewControllers: [UIViewController] = self.navigationController?.viewControllers as! [UIViewController] 

бросает его именно как массив (Swift массив) UIViewControllers. Вы можете на самом деле писать короче и просто так:

let viewControllers = self.navigationController?.viewControllers as! [UIViewController] 
+0

Я получил '[UIViewController] не имеет члена с именем 'indexOfObject'' –

0

Попробуйте следующий код:

override func viewWillDisappear(animated: Bool) { 
    if let viewControllers = navigationController?.viewControllers as? [UIViewController] { 
     if let index = find(viewControllers, self) { 
      navigationController?.setNavigationBarHidden(true, animated: true) 
     } 
    } 

    viewWillDisappear(animated) 
} 

Использование находки() более рядный с Swift от моего мнения. find() вернет индекс элемента, если он найден, иначе в противном случае.

+0

У меня есть 'Can not invoke 'find' со списком аргументов типа ([AnyObject]?, ...' –

+0

Спасибо за помощь! –