2017-01-04 3 views
0

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

Unexpectedly found nil while unwrapping an Optional value 

Если я закомментируйте строку vw.updateTerm (...) он работает. В конечном счете, я хочу обновить uitextview с данными, обновленными из BLE и/или http-запроса. Любая помощь или направление будут оценены наиболее высоко.

Моя площадка скор 3 код выглядит следующим образом:

import UIKit 
import PlaygroundSupport 

public class TextViewController : UIViewController { 

    public var textView : UITextView! 

    override public func loadView() { 
     textView = UITextView() 
     textView.text = "Hello World!\nHello Playground!" 

     self.view = textView 
    } 

    func updateTerm(textToUpdate: String) { 
     self.textView.text.append(textToUpdate) 
    } 
} 

let vw = TextViewController() 
vw.updateTerm(textToUpdate: "here you go") 

PlaygroundPage.current.liveView = vw 

ответ

0

Проблема заключается в том, что loadView еще не вызывается в тот момент, когда вы пытаетесь updateTerm, что означает, что textView находится в loadView для nilvw экземпляр.

Поскольку textView объявлен как принудительно развернутое свойство, любая попытка его использования в то время как оно равна nil (как в вашем случае) приведет к ошибке выполнения.

Вы должны сделать это либо обычный опционный:

public var textView : UITextView? 

override public func loadView() { 
    textView = UITextView() 
    textView?.text = "Hello World!\nHello Playground!" 
    self.view = textView 
} 

func updateTerm(textToUpdate: String) { 
    self.textView?.text.append(textToUpdate) 
} 

или, например, ленивым свойство (если подходит в вашем случае):

lazy public var textView = UITextView() 

override public func loadView() { 
    textView.text = "Hello World!\nHello Playground!" 
    self.view = textView 
} 

func updateTerm(textToUpdate: String) { 
    self.textView.text.append(textToUpdate) 
} 

Более подробную информацию можно найти here.

+0

Спасибо, ссылка помогла объяснить это лучше. Я использовал опцию Lazy, которая отлично работала для ошибки времени выполнения. Я добавил пару строк следующим образом, чтобы добавить в текстовое представление, он обновляется, но текст никогда не попадает на отображаемый текстовый вид. [code] print (vw.textView.text) vw.updateTerm (textToUpdate: "\ nhere you go 2") print (vw.textView.text) 'code' – user7376605

+0

Добавлены эти строки кода. Похоже, что у меня есть 2 экземпляра textView, потому что на игровой площадке он добавляется к 1 экземпляру, но не к отображаемому. Мне нужно сделать что-то еще в моем классе? 'Vw.updateTerm (textToUpdate:" \ nhere you go ") print (vw.textView.text) vw.updateTerm (textToUpdate:" \ nhere you go 2 ") печать (vw.textView.text) ' – user7376605