Присвоение текста программно объявленному UIlabel

swift
xcode
ios

#1

Всем привет, я новичок в программировании. Поверх гуглокарт программно создаю кнопку и текстовую метку, так как через сториборд не отображается поверх карты. Но тут возникла трудность, при попытке присваивания текста этой самой программно объявленной текстовой метке с помощью testTextview2.text = “Широта: (myLatstr) Долгота: (myLonstr) Тип метки: (posType)” возникает ошибка Thread1: EXC_BAD_INSTRUCTION
Подскажите что не так в моем коде? Надеюсь на вашу отзывчивость.
Код:

class ViewController: UIViewController {
    
    @IBOutlet var mMap: GMSMapView!

    @IBOutlet weak var testTextview2: UILabel!
  
    let locationManager = CLLocationManager()
    
    override func loadView() {
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let camera = GMSCameraPosition.camera(withLatitude: 55.7522200, longitude: 37.6155600, zoom: 15.0)
        let mMap = GMSMapView.map(withFrame: CGRect.zero, camera: camera) // CGRect.zero
        
        view = mMap

        mMap.isMyLocationEnabled = true
        mMap.settings.compassButton = true
        mMap.settings.myLocationButton = true
        mMap.settings.scrollGestures = true
           
        locationManager.delegate = self
        locationManager.requestWhenInUseAuthorization()
        
        let buttonDp = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 50))
        buttonDp.backgroundColor = .green
        buttonDp.setTitle("Test Button", for: .normal)
        buttonDp.addTarget(self, action: #selector(buttonAct), for: .touchUpInside)
        self.view.addSubview(buttonDp)
        
        let testTextview2 = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 21))
        testTextview2.center = CGPoint(x: 160, y: 285)
        testTextview2.textAlignment = .center
        testTextview2.text = "I'am a test label"
        self.view.addSubview(testTextview2)      
    }
    
    func buttonAct(sender: UIButton!) {
          posType = 40
          myLatstr = String(myLat)
          myLonstr = String(myLon)
          testTextview2.text = "Широта: \(myLatstr) Долгота:  \(myLonstr) Тип метки:  \(posType)"
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

#2

testTextview2 в методе buttonAct: вы откуда берете?


#3

Я конечно не разбираюсь пока в этом. Но его еще раз нужно объявлять там? Просто когда кнопка создается через сториборд, то по такому же принципу все работает и текст присваивается. А при программном объявлении выходит ошибка. Причем ни на каких сайтах я не увидел примеров работы с программно объявленными компонентами интерфейса. Есть только примеры как их объявлять и все. Подскажите пожалуйста что мне сделать?


#4

Раз Вы используете testTextview2 еще и в другом методе, значит он у Вас есть где-то за пределами метода. Не нужно создавать еще раз, Вы можете просто воспользоваться уже созданных экземпляром.


#5

Пожалуйста объясните как я могу присвоить текст уже объявленному UILabel? Я ведь его больше ни где не использую. Если не хотите объяснять просто напишите строку которая будет присваивать новый текст.


#6

В Вашем коде все написано правильно:

Единственное, есть такое впечатление, что первое let либо просто нужно убрать, либо понять, что такое testTextview2 и откуда оно берется в строке:

testTextview2.text = "Широта: \(myLatstr) Долгота: \(myLonstr) Тип метки: \(posType)"


#7

Я изначально понял что с помощью let testTextview2 = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 21)) мы объявляем UIlabel, а потом можем к нему обращаться для обновление его содержимого, поэтому в обработчике нажатия кнопки я обращаюсь к нему для смены текста testTextview2.text = "Широта: (myLatstr) Долгота: (myLonstr) Тип метки: (posType)"
Но видимо здесь все по другому устроено. Так как же мне сменить текст при нажатии кнопки в UILabel ? Или в нем нельзя менять текст после его объявления? На андроиде это все так элементарно делается, просто объявили Textview и потом из любой части кода можем менять в нем текст, а здесь все так сложно что ни кто даже не может сказать как поменять текст в уже объявленном UILabel (((


#8

Здесь тоже все делается просто. Вы просто должны объявить testTextview2 в качестве свойства класса и можете везде к нему обращаются. Но если Вы создаете его внутри какого-то метода, то соотвественно он не может выйти за пределы своей зоны видимости.


#9

Все разжевали, спасибо! Переделал, заработало))