2015-05-04 4 views
1

я получаю ошибку:Ошибка при попытке использовать текстовый вид вне контроллера представления

Fatal error: unexpectedly found nil while unwrapping an Optional value

всякий раз, когда я пытаюсь добавлять текст в текстовом виде (bottomTextView) вне моего зрения контроллера. Мое текстовое представление связано с моим основным контроллером. У меня есть еще один класс с именем Checkbox (подкласс UIButton), который пытается добавить текст в текстовом виде с помощью:

var main_vc = ViewController() 
main_vc.bottomTextView.insertText("Checked") 

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

bottomTextView.insertText("Checked") 

Я не могу понять, почему это так и как это исправить. Благодаря!

EDIT:

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

ответ

2

У вас нет view. Я думаю, вы создаете, если из nib файла, и именно поэтому вы должны инициализировать его, как этот

var main_vc = ViewController(nibName: "ViewController", bundle: nil) 

При попытке доступа без представления, то IBOutlets равны нулю, так как они не связаны ни к чему , Вот почему вы получаете эту ошибку.

Вторая вещь работает, потому что все методы существуют в вашем объекте ViewController, но нет контроля над ним.

Если вы использовали раскадровку для создания файла, вам сначала нужно будет установить идентификатор для этого ViewController как этот

enter image description here

А затем создать ViewController как это

let storyboard = UIStoryboard(name: "Main", bundle: nil) // Or what ever your storyboard file name is 
let main_vc = storyboard.instantiateViewControllerWithIdentifier("PublishView") as! ViewController // What you name your view controller 
+0

Спасибо за ответ! Похоже, это не трюк, хотя может быть, потому что я не знаком с файлом nib. – Brejuro

+0

Где вы создали интерфейс? Этот файл называется 'something.storyboard' или' something.xib'? Если он находится в раскадровке, вам нужно установить идентификатор и инициализировать его по-другому. Дайте мне знать, если это так, и я напишу ответ. –

+0

Я создал его в раскадровке – Brejuro

1

Если вы используете Storyboard then;

var storyboard = UIStoryboard(name: "Main", bundle: nil) 
var main_vc = storyboard.instantiateViewControllerWithIdentifier("ViewControllerIdentifier") as! ViewController 
main_vc.bottomTextView.insertText("Checked") 
+0

Спасибо за ответ! Эта строка 'var main_vc = storyboard.instantiateViewControllerWithIdentifier (« ViewControllerIdentifier ») как! ViewController' дает мне ошибку 'Checkbox.type не имеет члена с именем storyboard', даже если он прав в строке до – Brejuro

+0

Если ваш класс является подклассом UIViewController, этот фрагмент кода должен работать. И убедитесь, что в вашей раскадровке вы должны добавить идентификатор раскадровки для своего контроллера просмотра. – ridvankucuk

+0

Мой класс является подклассом UIButton, я делаю что-то невероятно неправильно? Мои извинения, что я новичок в этом. Я добавил больше информации в свою проблему – Brejuro

1

Я подозреваю, что ваша проблема, вы пытаетесь получить доступ к bottomTextView, из другого контроллера представления, прежде чем вы представили контроллер представления (с Segue, например). В этом случае ни один из ViewController 's IBOutlet s не был установлен, поэтому вы получаете эту ошибку.

Я думаю, вы думаете об этом не так, но контроллер точки зрения не должен напрямую редактировать внешний вид контроллера. Вместо этого вы можете установить текст, который должен появиться в bottomTextView, в prepareForSegue.Так, например, сказать, что это был ваш ViewController класс:

class ViewController : UIViewController { 
    var yourText: String = "" 
    @IBOutlet var bottomTextView: UITextView! 

    override func viewDidLoad() { 
     // In viewDidLoad all the outlets have been set so you won't get any errors 
     // setting the text. 
     bottomTextView.text = yourText 
    } 
} 

И это был еще один контроллер представления вы хотите, чтобы перейти от, к экземпляру ViewController:

class AnotherViewControler : UIViewController{ 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if let vc = segue.destinationViewController as? ViewController 
      where segue.identifier == "YourSegueID" { 

      vc.yourText = "SomeText" 
     } 
    } 
} 

Для получения более подробной информации о передаче данных между представлением контроллеры, посмотрите на этот вопрос: How do you share data between view controllers and other objects in Swift?

+0

Я пытаюсь получить доступ к bottomTextView из другого класса с именем Checkbox, который является подклассом UIButton. Я добавил больше информации к моей проблеме выше. Спасибо за ответ! – Brejuro

+0

Мне кажется, что вы не следуете шаблону проектирования MVC. Я бы действительно рекомендовал посмотреть лекции MVC в этом: https://itunes.apple.com/gb/course/developing-ios-8-apps-swift/id961180099 – ABakerSmith

+0

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