2015-01-28 2 views
6

Добрый день, ребята, я изучаю Свифта, нужна помощь здесь.Swift popToViewController

Пользователь регистрируется и отображает их изображение. После отклонения выбора изображения я хотел бы, чтобы появился ComposeViewController.

Вот код:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: NSDictionary!) { 
    let pickedImage:UIImage = info.objectForKey(UIImagePickerControllerOriginalImage) as UIImage 

    //Scale Down Image 
    let scaledImage = self.scaleImageWith(pickedImage, and: CGSizeMake(100,100)) 

    let imageData = UIImagePNGRepresentation(scaledImage) 

    let imageFile:PFFile = PFFile(data: imageData) 

    PFUser.currentUser().setObject(imageFile, forKey: "profileImage") 
    PFUser.currentUser().saveInBackgroundWithTarget(nil, selector: nil) 

    picker.dismissViewControllerAnimated(true, completion: nil) 

    //this is the line seems to have problem. 
    self.navigationController?.popToViewController(ComposeViewController, animated: true) 
} 

Тогда я получил эти ошибки: ComposeViewController.Type «не конвертируется в» UIViewController Ожидаемое имя элемента или вызов конструктора после имени типа

имеет предложение для исправления путем put() после ComposeViewController, но затем он выдает больше ошибок после исправления.

Надеюсь, кто-то может помочь. Благодаря! :-)

+1

Добро пожаловать на SO !: Но что именно ваш вопрос/проблема? Вы получили сообщение об ошибке? Не отображается ли ваш ComposeViewController? (пожалуйста, отредактируйте ваш вопрос и добавьте эту информацию) –

+0

Спасибо, Фрэнк! В следующий раз я обращу внимание на это. :-) – bobster

ответ

0

навигационный контроллер поддерживает стопку просмотров, которые вы нажимаете. Его как Последняя в первой очереди.

Для того, чтобы поместить в ComposeViewController, это представление должно уже существовать в очереди, и вы должны иметь ссылку на него.

Вам нужно будет передать экземпляр ComposeViewController. для простоты вы можете сохранить эту ссылку в appdelegate. (этот подход не рекомендуется)

2

В итоге я заменил следующий код внутри основного вида, и он работает. Я не уверен, правильно ли это, не могли бы вы дать мне несколько комментариев?

//self.navigationController?.popToViewController(ComposeViewController, animated: true)  
let switchViewController = self.storyboard?.instantiateViewControllerWithIdentifier("view2") as ComposeViewController 

    self.navigationController?.pushViewController(switchViewController, animated: true) 

Я определил «view2» как идентификатор целевой раскладки.

4

Там метод, который позволяет получить доступ к массиву всех ViewControllers на текущем стеке, и вы можете захватить тот, который вы хотите, используя свой индекс, например:

let switchViewController = self.navigationController?.viewControllers[1] as! ComposeViewController 

self.navigationController?.popToViewController(switchViewController, animated: true) 
1
if let composeViewController = self.navigationController?.viewControllers[1] { 
      self.navigationController?.popToViewController(composeViewController, animated: true) 
} 
0
for (var i = 0; i < self.navigationController?.viewControllers.count; i++) 
{ 
    if(self.navigationController?.viewControllers[i].isKindOfClass(DestinationViewController) == true) 
    { 
     self.navigationController?.popToViewController(self.navigationController!.viewControllers[i] as! DestinationViewController, animated: true) 

    break; 
    } 
} 
4

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

Многие ответы здесь кажутся людьми, которые не читали ваш вопрос, просто название. Я оставлю этот код здесь, если это поможет кому угодно.

let vcIndex = self.navigationController?.viewControllers.indexOf({ (viewController) -> Bool in 

    if let _ = viewController as? ComposeViewController { 
     return true 
    } 
    return false 
}) 

let composeVC = self.navigationController?.viewControllers[vcIndex!] as! ComposeViewController 

self.navigationController?.popToViewController(composeVC, animated: true) 
-1
let controllers = self.navigationController?.viewControllers 
       for vc in controllers! { 
       if vc is YourVC { 
        _ = self.navigationController?.popToViewController(vc as! YourVC, animated: true) 
       } 
      } 
Смежные вопросы