Wpis z mikrobloga

Mireczki, szybkie pytanie z #iosdev #swift . Mam swoją klasę i chciałbym z jej poziomu odnieść się do labela, którego mam w ViewController. Oczywiście label mam zadeklarowany:

@IBOutlet weak var status: UILabel!
I z poziomu ViewController działa poniższy kod:

self.status.text = "test";
Jednak gdy chcę z poziomu mojej klasy zmienić tekst to po wpisaniu:

ViewController().status.text = "mojtekst";
Program się kompiluje, jednak wywala błąd podczas działania:

fatal error: unexpectedly found nil while unwrapping an Optional value
Co robię nie tak?
  • 18
@wczoraj: Nie pomogło, w ViewController zmieniłem deklarację na:

@IBOutlet var status: UILabel!
I nadal ten sam błąd (pomimo, że zmieniam tekst gdy ten label jest na pewno na aktualnym ekranie).
@loginek0: może za mało informacji podajesz, jak staniesz breakpontem na tej linii gdzie zmieniasz text i sprobujesz wypisac info o tej labelce to co dostajesz? albo zle rozumiem to co ogolnie chcesz zrobic ze zmiana labelki z innego controllera, zaprojektowales to z sensem?
@wczoraj: Ok, więcej informacji. Mam klasę wykorzystującą Bluetooth. Początek klasy:

import Foundation
import CoreBluetooth

let btDiscoverySharedInstance = BTDiscovery();

class BTDiscovery: NSObject, CBCentralManagerDelegate {

private var centralManager: CBCentralManager?
private var peripheralBLE: CBPeripheral?

override init() {
super.init()

let centralQueue = dispatch_queue_create("com.raywenderlich", DISPATCH_QUEUE_SERIAL)
centralManager = CBCentralManager(delegate: self, queue: centralQueue)
}

W tej klasie mam funkcję, która sprawdza czy bluetooth jest włączony itd. Wygląda ona tak:

func centralManagerDidUpdateState(central: CBCentralManager) {
switch (central.state) {
case CBCentralManagerState.PoweredOff:
Pobierz loginek0 - @wczoraj: Ok, więcej informacji. Mam klasę wykorzystującą Bluetooth. Począ...
źródło: comment_Cr3GdGdIzU7yL6Yi6FYdjIh8lv06dIGo.jpg
@loginek0: twój sposób zmiany wartości IBOutlet nie jest dobry, bo tylko viewController powinien zmieniać swoje properties. Zewnętrzna klasa nie ma informacji o tym co się dzieje w controllerze, na przykład widok może nie być jeszcze utworzony i duża szansa, że appka Ci się wysypie. Poza tym zaciemnia to bardzo kod, potem będziesz szukał po całej appce w którym miejscu wartość labelki jest zmieniana. No i z tego co widzę z linka
@loginek0: tworzysz nową instancje klasy moglbys to jakos naprawic ale ogólnie nie powinieneś tego robić w ten sposób klasa bluetootha ma tylko bluetoothem sie zajmowac. Albo zrób delegata albo zrób w klasie ViewController metode która bedzie przyjmowala stringa i ustawiala go do labelki. Taka metode wtedy wywolasz w miejscu gdzie próbujesz zmienic tekst. I jak wszedzie uzywasz "!" to najlepiej jakos sie zabezpieczac przed nilem
@dzana: @lawicko: @wczoraj: A mam jeszcze dwa pytania:
1. Lepiej skorzystać z NSNotificationCenter czy delegatów? Która metoda wydaje się być lepsza? Bo faktycznie bezsensowne wydaje się, abym tworzył metodę w ViewController, która zmieni tekst i odwoływał się do niej w mojej klasie BT. Tym bardziej, że chcę wykorzystać drugi ViewController (w sumie będą dwa) i w nim też będę chciał robić jakąś akcję np. po rozłączeniu się urządzenia BT.
@loginek0: Co do pytania 1 to zależy co chcesz uzyskać. Polecam używać NSNotificationCenter tylko wtedy, gdy chcesz coś przekazać w wiele miejsc, i kolejność w jakiej otrzymasz powiadomienie nie jest dla Ciebie ważna. Akurat w przypadku, który opisujesz wydaje się to mieć sens. Jest jeszcze jedna metoda zaimplementowania tego, mianowicie key-value-observing. Ja osobiście od pewnego czasu nie używam kvo ani NSNotificationCenter, tylko callbacków. Dobry artykuł masz tutaj.
1. Lepiej skorzystać z NSNotificationCenter czy delegatów? Która metoda wydaje się być lepsza? Bo faktycznie bezsensowne wydaje się, abym tworzył metodę w ViewController, która zmieni tekst i odwoływał się do niej w mojej klasie BT. Tym bardziej, że chcę wykorzystać drugi ViewController (w sumie będą dwa) i w nim też będę chciał robić jakąś akcję np. po rozłączeniu się urządzenia BT.


@loginek0: najlepiej unikac NSNotificationCenter za wszelka cene, chyba ze jest
@Nadrill: Dzięki za wypowiedź :). Akurat jeśli chodzi o mój przypadek to bardziej sprawdzi się chyba NSNotificationCenter, ponieważ właśnie chcę z systemu pobrać informację na temat połączenia Bluetooth (czy jest włączony czy nie, czy już się połączył z danym urządzeniem czy nie itd).