2014-12-22 7 views
1

Я пытаюсь получить имя в textLabel первой ячейки, которая проверяется в моем tableView, но я не могу получить AnyObject, преобразованный в строку. Моя ошибка говорит:Anyobject string при добавлении массива

fatal error: unexpectedly found nil while unwrapping an Optional value 

и он появляется в последней строке моего кода.

var stringList = [String]() 

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    let mySelectedCell: UITableViewCell = tableView.cellForRowAtIndexPath(indexPath)! 

    if (mySelectedCell.accessoryType == UITableViewCellAccessoryType.Checkmark) { 
     mySelectedCell.accessoryType = UITableViewCellAccessoryType.None   
    } 
    else { 
     mySelectedCell.accessoryType = UITableViewCellAccessoryType.Checkmark 
     mySelectedCell.tintColor = UIColor.blackColor() 

     if let tx = mySelectedCell.textLabel?.text as Optional{ 

      stringList.append(tx)} 
     }   
    } 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    var destVC: AddFriendViewController = segue.destinationViewController as AddFriendViewController 

     destVC.viewOut.text! = stringList[0] as String 
} 

Любые мысли о том, как действовать, будут оценены по достоинству.

EDIT: Адресат код ВК:

@IBOutlet weak var usernameLabel: UITextField! 

@IBOutlet weak var viewOut: UITextField! 

var viewer:String = String() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    viewOut.text = viewer 

    // Do any additional setup after loading the view. 
} 

EDIT 2: Заменяя функцию prepareForSegue я избавилась от моей ошибки, но ярлык еще не показывает какой-либо текст.

func friendAdded(){ 

    var destVC: AddFriendViewController = AddFriendViewController() 
     destVC.viewer = stringList[0]  
} 
+0

моя мысль в том, что viewOut destVC в настоящее время не инициализирован, и поэтому вы получаете нильполугруппы – chris

+0

@ Крис Я добавил код для назначения VC тоже. – martin

+0

Я не понимаю, что вы подразумеваете под «заменой функции« prepareForSegue », поскольку вы затем переходите к тому, чтобы показать нам метод« friendAdded », который не имеет никакого смысла. Вы должны сохранить свой метод 'prepareForSegue', но просто измените его так, чтобы он устанавливал' viewer', а не 'viewOut.text'. Не выполняйте segue автоматически (но скорее запускайте его программно в 'didSelectRowAtIndexPath'), но вам нужно сохранить метод' readyForSegue', который устанавливает 'viewer' в пункт назначения. – Rob

ответ

0

Есть несколько вопросов:

  1. Вы не можете иметь ваш контроллер источник попытки доступа к IBOutlet пункту назначения. К моменту вызова prepareForSegue элементы управления, на которые ссылаются выходы IB, еще не созданы, поэтому viewOut, несомненно, остается nil.

    Таким образом, вместо того, чтобы иметь prepareForSegue сделать следующее:

    destVC.viewOut.text! = stringList[0] as String 
    

    Он должен вместо этого просто установите String свойство, viewer:

    destVC.viewer = stringList[0] 
    

    А потом viewDidLoad места назначения затем заселить UITextField управление под названием viewOut от String под названием viewer:

    viewOut.text = viewer 
    
  2. Это не совсем ясно из вашего образца кода, но казалось бы, что вы могли бы иметь как метод didSelectRowAtIndexPath, а также SEGUE идущий от ячейки к контроллеру вида назначения. (Я предполагаю, что это потому, что я не вижу здесь ничего, что программно при запуске SEGUE.)

    Если да, то это проблема, потому что переход может быть выполнен перед темdidSelectRowAtIndexPath называется (т.е. вы будете см. prepareForSegue, вызывается до didSelectRowAtIndexPath). Чтобы решить эту проблему, удалите segue из ячейки в следующую сцену, но вместо этого выполните segue между двумя сценами. (Т.е. сделать так, чтобы переход не вызывается автоматически при выборе ячейки.) Если вы даете, что непосредственно перейти уникальный раскадровки идентификатор, то вы можете вызвать его программно с вашего didSelectRowAtIndexPath:

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
        let mySelectedCell: UITableViewCell = tableView.cellForRowAtIndexPath(indexPath)! 
        if let tx = mySelectedCell.textLabel?.text as String? { 
         stringList.append(tx) 
        } 
    
        performSegueWithIdentifier("yourseguestoryboardidhere", sender: self) 
    } 
    
  3. Это немного более академичным (и не связанным с проблемой), но обычно вы не должны извлекать текст, который должен быть передан следующей сцене из ячейки. Вы действительно должны вернуться к своей модели.

+0

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

+0

Я сделал это, и все получилось отлично, поэтому в вашей реализации должно быть что-то не так. Просто вставьте отладочные сообщения повсюду (в 'didSelect',' prepareSegue', в 'viewDidLoad 'адресата и т. Д.) И выясните, где именно это происходит. Есть слишком много точек возможных ошибок, которые можно угадать случайным образом. Кроме того, вы внесли изменения, чтобы 'didSelect' вызывал segue программно, а не автоматически? – Rob

+0

Большое спасибо, вы были очень полезны. Мне нужно обернуть голову вокруг того, что вы только что упоминали, потому что есть некоторые вещи, с которыми я еще не совсем знаком. При этом я уверен, что вашей информации более чем достаточно, когда я получу свое понимание. Еще раз спасибо! – martin

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