2015-01-27 5 views
0

У меня есть панель вкладок с элементом, который ведет к контроллеру навигации, который имеет список друзей пользователя. Однако, хотя анонимный пользователь должен иметь возможность просматривать приложение, я только хочу, чтобы пользователи входили в список пользователей, так как только тогда у них будут друзья. Я использую Parse в качестве бэкэнд, поэтому я могу проверить PFUser.currentUser(), но я понятия не имею, как сообщить контроллеру навигации переходить к VC, который предлагает пользователю войти в систему/зарегистрироваться, если они еще не были. Заранее спасибо.Swift - Segue для определенного вида, если выполнены условия

Edit: Я реализовал предложенное решение в классе контроллера панели вкладок, и выглядит следующим образом:

override func viewDidLoad() { 
    super.viewDidLoad() 
    tabBarController?.delegate = self 
} 

func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool { 
    if viewController == FriendsTableViewController() { 
     if PFUser.currentUser() != nil { 
      println("there is a logged in user") 
      return true 
     } else { 
      let authVC:UIViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("auth") as UIViewController 
      presentViewController(authVC, animated: true, completion: nil) 
      println("attempted to present auth vc") 
      return false 
     } 
    } else { 
     println("not friends table vc") 
     return true 
    } 
} 

Однако, ничего не выводится, когда я выбираю бар пункт друзей. Что мне не хватает?

Редактировать: Разрешено. Это код viewWillAppear в контроллере представления для друзей ВХ:

override func viewWillAppear(animated: Bool) { 
    if PFUser.currentUser() == nil { 
     var login = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("auth") as AuthenticationVC 
     self.presentViewController(login, animated: animated, completion: nil) 
    } 
} 
+0

Вы установили 'tabBarController.delegate' в' self'? Кроме того, я бы вернул 'true' в ваш _not список друзей vc_' else', потому что вы все равно захотите переключиться на другие представления, если у вас нет других причин для возврата 'false'. – Sean

+0

Проблема все еще существует. – Technicolor

+0

Делегат должен быть установлен вне вызова метода. Если вы используете раскадровку, вы можете перетащить свойство 'delegate' в инспекторе подключения к вашему контроллеру представления. Если вы делаете это с помощью кода, вы можете установить делегат в свой метод 'viewDidLoad' – Sean

ответ

0

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

например. внутри контроллера представления списка друзей (при условии использования раскадровки, но это не делает большой разницы):

override func viewWillAppear(animated: Bool) { 
    if PFUser.currentUser() == nil { 
     var login = UIStoryboard(name: "MyStoryboard", bundle: nil).instantiateViewControllerWithIdentifier("LoginViewController") as LoginViewController 
     //set properties of login 
     self.presentViewController(login, animated: YES) 
    } 
} 

(или используйте performSegue)

ИМХО модальный стиль презентации здесь более уместен, так как это как касательной от пользовательского опыта.

0

Существует метод делегата UITabBarControllerDelegate, который будет работать. Вы можете выполнить проверку, используя переменную viewController, предоставленную делегатом.

func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool { 
    if viewController == FriendListViewController() { 
     if PFUser.currentUser() != nil { 
      return true 
     } 
     else { 
      // Prompt login/signup 
      return false 
     } 
    } 
} 
+0

Где лучше всего разместить этот код? Насколько мне известно, вы не можете подключиться к элементу пользовательского интерфейса из любого произвольного файла. Благодарю. – Technicolor

+0

Я полностью пропустил часть панели вкладок вашего вопроса. Но идея все равно будет работать. Код может идти в 'tabBarController: shouldSelectViewController:', который является методом в 'UITabBarControllerDelegate', но вместо вызова' performSegueWithIdentifier' вы просто возвращаете 'true', если пользователь вошел в систему и возвращает' false', если пользователь не зарегистрирован __not__ Я обновил ответ с помощью метода делегата. – Sean

+0

Можете ли вы показать образец того, что у вас есть прямо сейчас? – Sean

Смежные вопросы