I'm completely new to programming. Trying to learn Swift. I've created the UI for my app. A simple data entry app for weight lifting PB's. However when I close the app my data doesn't update to new stored values. How do assign a variable string to each UITextfield entry, which when I close the app it will display its last stored value?
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
#IBOutlet weak var benchPressPB: UITextField!
#IBOutlet weak var squatPB: UITextField!
#IBOutlet weak var deadliftPB: UITextField!
#IBOutlet weak var ohpPB: UITextField!
#IBOutlet weak var rackPullPB: UITextField!
#IBOutlet weak var legPressPB: UITextField!
#IBOutlet weak var pullUpsPB: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
self.benchPressPB.delegate = self
self.squatPB.delegate = self
self.deadliftPB.delegate = self
self.ohpPB.delegate = self
self.rackPullPB.delegate = self
self.legPressPB.delegate = self
self.pullUpsPB.delegate = self
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
}
P.S this may completely wrong and long already, but currently its achieving what I want it do, just not saving new inputted data. If there's any shorter way to get the keyboard to hide on return, let me know!
Your current code doesn't do anything with the values a user enters into your text fields.
You should
Set up a model object to hold the values that the user enters.
In your textFieldShouldReturn, collect the user input and save it
into your model.
Decide on how you want to persist your app's state so it restores
when the app is launched. At it's simplest, this could be saving each
string to a different key/value pair in UserDefaults, or grouped
together in a dictionary or an array.
The code might look something like this: (not tested. Not even compiled. It will need cleanup before you can use it:
#IBOutlet weak var benchPressPB: UITextField!
#IBOutlet weak var squatPB: UITextField!
#IBOutlet weak var deadliftPB: UITextField!
#IBOutlet weak var ohpPB: UITextField!
#IBOutlet weak var rackPullPB: UITextField!
#IBOutlet weak var legPressPB: UITextField!
#IBOutlet weak var pullUpsPB: UITextField!
var textFields = [UITextField]
var textFieldKeys = [
"benchPressPB",
"squatPB",
"deadliftPB",
"ohpPB",
"rackPullPB",
"legPressPB",
"pullUpsPB"
]
var textFieldStrings = [String]()
override func viewDidLoad() {
super.viewDidLoad()
// Note that you can hook up the delegates for your
// text fields in your Storyboard.
self.benchPressPB.delegate = self
self.squatPB.delegate = self
self.deadliftPB.delegate = self
self.ohpPB.delegate = self
self.rackPullPB.delegate = self
self.legPressPB.delegate = self
self.pullUpsPB.delegate = self
textFields = [benchPressPB, squatPB, deadliftPB, ohpPB, rackPullPB, legPressPB, pullUpsPB]
// Read values from UserDefaults into the text fields.
for (index, key) in textFieldKeys.enumerated() {
let aValue = UserDefaults.standard.string(forKey: key)
textFields[index].text = aValue
textFieldStrings.append(aValue ?? "")
}
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
let newText = textField.text
if let index = textFields.firstIndex(of: textField) {
textFieldStrings[index] = newText
UserDefaults.standard.set(newText, forKey: textFieldKeys[index])
}
return true
}
You can subclass UITextField and add a target for editing changed. Every time your text changes you can simply save its new value into user defaults. To make sure you use a unique key for each field you can override the accessibilityIdentifier and implement didSet to load the old values when you set its identifier:
import UIKit
class PersistentTextField: UITextField, UITextFieldDelegate {
override var accessibilityIdentifier: String? {
didSet {
text = UserDefaults.standard.string(forKey: accessibilityIdentifier ?? "")
}
}
override func didMoveToSuperview() {
addTarget(self, action: #selector(editingChanged), for: .editingChanged)
autocapitalizationType = .none
autocorrectionType = .no
delegate = self
}
#objc func editingChanged(_ textField: UITextField) {
UserDefaults.standard.set(text ?? "", forKey: accessibilityIdentifier ?? "")
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
resignFirstResponder()
return true
}
}
Then in your view controller just make sure to set their id when your view loads:
import UIKit
class ViewController: UIViewController {
#IBOutlet weak var benchPressPB: PersistentTextField!
#IBOutlet weak var squatPB: PersistentTextField!
#IBOutlet weak var deadliftPB: PersistentTextField!
#IBOutlet weak var ohpPB: PersistentTextField!
#IBOutlet weak var rackPullPB: PersistentTextField!
#IBOutlet weak var legPressPB: PersistentTextField!
#IBOutlet weak var pullUpsPB: PersistentTextField!
override func viewDidLoad() {
super.viewDidLoad()
benchPressPB.accessibilityIdentifier = "bench press"
squatPB.accessibilityIdentifier = "squat"
deadliftPB.accessibilityIdentifier = "dead lift"
ohpPB.accessibilityIdentifier = "ohp"
rackPullPB.accessibilityIdentifier = "rack pull"
legPressPB.accessibilityIdentifier = "leg press"
pullUpsPB.accessibilityIdentifier = "pull ups"
}
}
I am new both to coding and to Xcode and am working on my first iOS app - so please forgive me if the answer to my question is obvious to experienced developers.
My app works but the design looks very "old fashioned" due to the buttons I have on each View Controller. I would prefer to use a more modern navigation system using Navigation Bars with Navigation buttons at the top of each screen. However, when I use this method of navigation the global variables entered on my first View Controller cannot be accessed on my final View Controller. I have double checked my Swift code files for each View Controller which, as explained, works fine if I have UIButtons instead of the Navbar.
The only difference I can see is that the Xcode 11 Navbar system uses the "Show" (Push) method of segues between View Controllers whereas my storyboard buttons use modal presentation.
I would be grateful if someone can steer me in the right direction - thanks!
The code showing the global variables from the first view controller is:
\\
import UIKit
var name = ""
var lastname = ""
var address = ""
var city = ""
var zip = ""
var email = ""
var phone = ""
var dateofbirth = ""
class ViewController1: UIViewController {
#IBOutlet weak var outlet: UITextField!
#IBOutlet weak var outlet2: UITextField!
#IBOutlet weak var outlet6: UITextField!
#IBOutlet weak var outlet3: UITextField!
#IBOutlet weak var outlet4: UITextField!
#IBOutlet weak var outlet5: UITextField!
#IBOutlet weak var outlet8: UITextField!
#IBOutlet weak var outlet7: UITextField!
#IBAction func submit(_ sender: Any) {
// Code for First Name
if (outlet.text != "")
{
name = outlet.text!
}
// Code for Last Name
if (outlet2.text != "")
{
lastname = outlet2.text!
}
// Code for Address
if (outlet3.text != "")
{
address = outlet3.text!
}
// Code for city
if (outlet4.text != "")
{
city = outlet4.text!
}
// Code for Zip
if (outlet5.text != "")
{
zip = outlet5.text!
}
// Code for Email
if (outlet6.text != "")
{
email = outlet6.text!
}
// Code for Phone
if (outlet7.text != "")
{
phone = outlet7.text!
}
// Code for Date of Birth
if (outlet8.text != "")
{
dateofbirth = outlet8.text!
}
// Dismissal of Keyboard
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
view.endEditing(true)
super.touchesBegan(touches, with: event)
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
\\\\
The code for the final View Controller is:
\\\\
import UIKit
class ReportViewController: UIViewController {
//Client ID Label Outlets
#IBOutlet weak var Label: UILabel!
#IBOutlet weak var Label2: UILabel!
#IBOutlet weak var Label3: UILabel!
#IBOutlet weak var Label4: UILabel!
#IBOutlet weak var Label5: UILabel!
#IBOutlet weak var Label6: UILabel!
#IBOutlet weak var Label7: UILabel!
#IBOutlet weak var Label8: UILabel!
// Return function
#IBAction func unwindToReportVC (_sender:UIStoryboardSegue){
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewDidAppear(_ animated:Bool){
// Client ID Labels text using declared global variables
Label.text = name
Label2.text = lastname
Label3.text = address
Label4.text = city
Label5.text = zip
Label6.text = email
Label7.text = phone
Label8.text = dateofbirth
}
}
I am dealing with an app created by some other developer. It's a complete app and has a lot of viewControllers , variables and outlets.
I keep getting the a crash after I load too many images from a server ( 200 for example ). I only get this message in the "print area" : "App terminated due to memory issue".
I use the library "SDWebImage" for loading the images. And I tried to find a memory leak using Instruments Allocations, and Leaks. I also used Memory Graph Debugger and non of them show leaks in my app.
Yet when I pop the View Controller ( DetailVC ) , it never fires the deinit method where I have put a message to print when this happens.
I have searched a lot to no vail. I have looked at these on Stackoverflow :
App Extension "Terminated due to memory issue"
App terminated due to memory issue
Through out my search I repeatedly see that response that the View Controller must be referenced by another view controller and this View Controller (DetailVC) strongly referencing the other.
I couldn't find that to be the case, although the file for the view controller is too large and I may have missed things.
It's difficult to go through the app and look for strong and weak references as the file is really huge.
is there a simple way ( or difficult for that matter ) to find the culprit and solve my problem.
Thanks
the code is huge (95000 characters) and contains sensitive information thus is not appropriate to post here. although I can post parts of it should you ask for it.
here is the code for DetailVC viewDidLoad :
import UIKit
import FTIndicator
import Cosmos
import Firebase
import MapKit
import YouTubePlayer
//MARK:- Gallery Collection Cell
class GalleryCollectionCell:UICollectionViewCell
{
#IBOutlet weak var imgViewShop: UIImageView!
override func awakeFromNib()
{
super.awakeFromNib()
}
}
//MARK:- Service Collection Cell
class ServiceCollectionCell:UICollectionViewCell
{
#IBOutlet weak var imgViewService: UIImageView!
#IBOutlet weak var lblService: UILabel!
override func awakeFromNib()
{
super.awakeFromNib()
}
}
#IBAction func btnBackAction(_ sender: Any)
{
self.navigationController?.popViewController(animated: true)
SDImageCache.shared().clearMemory()
SDImageCache.shared().clearDisk()
}
//MARK:- Detail Main Class
class DetailVC: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout,UITableViewDataSource, UITableViewDelegate,RateFinalDelegate, PhotoDicDelegate
{
//MARK:- Outlets
#IBOutlet weak var tblViewRate: UITableView!
#IBOutlet weak var tblViewService: UITableView!
#IBOutlet weak var lblServices: UILabel!
#IBOutlet weak var collViewGallery: UICollectionView!
//#IBOutlet weak var collViewService: UICollectionView!
#IBOutlet weak var constTableViewHeight: NSLayoutConstraint!
#IBOutlet weak var constTlbViewServiceHeight: NSLayoutConstraint!
#IBOutlet weak var imgViewShop: UIImageView!
#IBOutlet weak var lblShopName: UILabel!
//#IBOutlet weak var lblShopNameDetail: UILabel!
#IBOutlet weak var btnFavourites: UIButton!
#IBOutlet weak var viewStar: CosmosView!
#IBOutlet weak var lblReviewCount: UILabel!
#IBOutlet weak var btnShopStatus: UIButton!
#IBOutlet weak var lblShopOnline: UILabel!
// #IBOutlet weak var lblDetailText: UILabel!
#IBOutlet weak var btnShopRate: UIButton!
#IBOutlet weak var lblShopAddress: UILabel!
#IBOutlet weak var lblShopWebsite: UILabel!
#IBOutlet weak var lblShopView: UILabel!
#IBOutlet weak var lblShopOpenStatus: UILabel!
//#IBOutlet weak var lblPhone1: UILabel!
#IBOutlet weak var lblShopDetail: UILabel!
// #IBOutlet weak var btnFacebook: UIButton!
// #IBOutlet weak var btnSnapchat: UIButton!
// #IBOutlet weak var btnInstagram: UIButton!
// #IBOutlet weak var btnTwitter: UIButton!
// #IBOutlet weak var btnYoutube: UIButton!
// #IBOutlet weak var btnVivo: UIButton!
// #IBOutlet weak var btnGoogle: UIButton!
#IBOutlet weak var lblSat: UILabel!
#IBOutlet weak var lblSun: UILabel!
#IBOutlet weak var lblMon: UILabel!
#IBOutlet weak var lblTues: UILabel!
#IBOutlet weak var lblWed: UILabel!
#IBOutlet weak var lblThru: UILabel!
#IBOutlet weak var lblFri: UILabel!
#IBOutlet weak var lblSatText: UILabel!
#IBOutlet weak var lblSunText: UILabel!
#IBOutlet weak var lblMonText: UILabel!
#IBOutlet weak var lblTuesText: UILabel!
#IBOutlet weak var lblWedText: UILabel!
#IBOutlet weak var lblThruText: UILabel!
#IBOutlet weak var lblFriText: UILabel!
#IBOutlet weak var lblworkingHour: UILabel!
#IBOutlet weak var lblGallery: UILabel!
#IBOutlet weak var lblReviews: UILabel!
#IBOutlet weak var btnSeeMore: UIButton!
#IBOutlet weak var btnBack: UIButton!
#IBOutlet weak var viewMain: UIView!
#IBOutlet weak var viewSuper: UIView!
#IBOutlet weak var viewService: UIView!
#IBOutlet weak var btnWebsite: UIButton!
#IBOutlet weak var btnPhone1: UIButton!
#IBOutlet weak var btnPhone2: UIButton!
#IBOutlet weak var btnPhone3: UIButton!
#IBOutlet weak var constPhone1Height: NSLayoutConstraint!
#IBOutlet weak var constPhone2Height: NSLayoutConstraint!
#IBOutlet weak var constPhone3Height: NSLayoutConstraint!
#IBOutlet weak var constPhoneViewHeight: NSLayoutConstraint!
#IBOutlet weak var constViewScrollHeight: NSLayoutConstraint!
#IBOutlet weak var scrollSocial: UIScrollView!
// #IBOutlet weak var btnSocialLink: UIButton!
#IBOutlet weak var btnGallery: UIButton!
#IBOutlet weak var constViewServiceHeight: NSLayoutConstraint!
//For Photo Class
#IBOutlet weak var tblViewHeader: UITableView!
#IBOutlet weak var switchGallery: UISwitch!
#IBOutlet weak var constTableViewGalleryHeight: NSLayoutConstraint!
var albumListArray = [AlbumListData]()
//For Video Class
#IBOutlet weak var collectionViewVideos: UICollectionView!
#IBOutlet weak var constCollViewVideoHeight: NSLayoutConstraint!
var videoDataArray = [VideoListData]()
var switchStatus = Bool()
//MARK:- Variables
let globalConstants = GlobalConstants()
var UserData = UserDataValue()
var reviewDataArray = [Review]()
var galleryDataArray = [Gallery]()
var serviceDataArray = [Service]()
var ShopId = String()
var favStatus = String()
var ShopStatus = String()
var Latitude = String()
var Longitude = String()
var strFacebook = String()
var strInstagram = String()
var NotifyId = String()
var strTwitter = String()
var strSnapchat = String()
var strYoutube = String()
var strGoogle = String()
var strVimeo = String()
var chatStatus = Bool()
var isfirstTime = Bool()
var receiverId = ""
var receiverImage = ""
var receiverName = ""
var strWebsite = ""
var shopOwnerId = ""
var ShopUnqueId = ""
var HideChatStatus = ""
var IsChatCreateScreen = ""
var strPhone1Number = String()
var strPhone2Number = String()
var strPhone3Number = String()
var RateText = Bool()
var ShopDeliveryServiceItself = Bool()
var CitySelectedId = String()
var OneToOneChatUserData : NSDictionary = [:]
var ShopString = "1159,1160,1162,1166,1167,1176,1178,1179,1180,1182,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1199,1202,1203,1206,1208,1209,1210,1214,1216,1217,1218,1224,1225,1227,1230,1232,1233,1234,1235,1236,1238,1239,1240,1242,1243,1244,1245,1246,1247,1248,1250,1252,1253,1255,1258,1259,1263,1264,1265,1266,1269,1270,1272,1275,1276,1277,1278,1279,1280,1281,1282,1283,1285,1298,1299,1302";
//MARK:- View Life Cycle
override func viewDidLoad()
{
super.viewDidLoad()
// collViewGallery.dataSource = self
// collViewGallery.delegate = self
// collViewService.dataSource = self
// collViewService.delegate = self
btnShopStatus.setTitle(" CHAT".localiz(), for: .normal)
btnSeeMore.setTitle("See More".localiz(), for: .normal)
btnShopRate.setTitle("RATE".localiz(), for: .normal)
btnGallery.setTitle("Gallery".localiz(), for: .normal)
lblworkingHour.text = "Working Hours:".localiz()
lblServices.text = "Services".localiz()
lblGallery.text = "Gallery".localiz()
lblReviews.text = "REVIEWS".localiz()
//lblDetailText.text = "DETAILS".localiz()
lblSatText.text = "Saturday".localiz()
lblSunText.text = "Sunday".localiz()
lblMonText.text = "Monday".localiz()
lblTuesText.text = "Tuesday".localiz()
lblWedText.text = "Wednesday".localiz()
lblThruText.text = "Thursday".localiz()
lblFriText.text = "Friday".localiz()
viewStar.settings.fillMode = .precise
self.navigationItem.title = globalConstants.detailText
tblViewRate.register(UINib(nibName: "RateTableVCell", bundle: nil), forCellReuseIdentifier: "RateTableVCell")
tblViewService.register(UINib(nibName: "ServiceTableCell", bundle: nil), forCellReuseIdentifier: "ServiceTableCell")
tblViewHeader.register(UINib(nibName: "SubCatHeaderTVC", bundle: nil), forCellReuseIdentifier: "SubCatHeaderTVC")
tblViewHeader.dataSource = self
tblViewHeader.delegate = self
tblViewHeader.estimatedRowHeight = 120
tblViewHeader.rowHeight = UITableViewAutomaticDimension
tblViewService.dataSource = self
tblViewService.delegate = self
tblViewService.estimatedRowHeight = 50
tblViewService.rowHeight = UITableViewAutomaticDimension
self.constTlbViewServiceHeight.constant = 20
collectionViewVideos.register(UINib(nibName: "VideoCollViewCell", bundle: nil), forCellWithReuseIdentifier: "VideoCollViewCell")
collectionViewVideos.dataSource = self
collectionViewVideos.delegate = self
collectionViewVideos.reloadData()
switchStatus = false
switchGallery.setOn(false, animated: true)
//self.constViewServiceHeight.constant = 20
tblViewRate.dataSource = self
tblViewRate.delegate = self
tblViewRate.estimatedRowHeight = 100
tblViewRate.rowHeight = UITableViewAutomaticDimension
//self.constTableViewGalleryHeight.constant = 20
self.constTableViewHeight.constant = 20
// self.tblViewHeader.isHidden = false
// self.collectionViewVideos.isHidden = true
// self.constCollectionViewHeight.constant = 30
ShopStatus = ""
self.addBackButton()
UserDefaults.standard.set(ShopId, forKey: "ShopValueId")
UserDefaults.standard.synchronize()
isfirstTime = true
viewSuper.backgroundColor = UIColor.lightGray
viewMain.isHidden = true
if LanguageManger.shared.currentLanguage == .en
{
lblServices.textAlignment = .left
btnBack.setImage(UIImage(named:"back"), for: .normal)
}
else
{
lblServices.textAlignment = .right
btnBack.setImage(UIImage(named:"ReverseBack"), for: .normal)
}
// if KAppDelegate.isUserLoggedIn()
// {
// let userDic = UserDefaults.standard.value(forKey: "UserData") as! [String:Any]
// self.UserData = UserDataValue.init(fromDictionary: userDic)
// UserId = self.UserData.id!
// UserName = self.UserData.name!
// }
if KAppDelegate.isUserLoggedIn()
{
let userDic = UserDefaults.standard.value(forKey: "UserData") as! [String:Any]
self.UserData = UserDataValue.init(fromDictionary: userDic)
CitySelectedId = self.UserData.city!
}
else
{
if UserDefaults.standard.value(forKey: "CitySelectedId") != nil
{
CitySelectedId = UserDefaults.standard.value(forKey: "CitySelectedId") as! String
}
else
{
CitySelectedId = "1"
}
}
ShopDetailAPIMethod()
}
override func viewWillAppear(_ animated: Bool)
{
self.navigationController?.navigationBar.isHidden = true
}
override func viewWillDisappear(_ animated: Bool)
{
self.IsChatCreateScreen = ""
self.navigationController?.navigationBar.isHidden = false
}
// override var preferredStatusBarStyle: UIStatusBarStyle
// {
// return .default
// }
//MARK:- Photo Dic Delegate Method
//MARK:- CreateNewChat Method
}
and this is how instantiate the DetailVC :
#objc func methodOfNotification(notification: Notification)
{
if UserDefaults.standard.value(forKey: "ShopValueId") != nil
{
let detailVC = self.storyboard?.instantiateViewController(withIdentifier: "DetailVC") as! DetailVC
detailVC.ShopId = UserDefaults.standard.value(forKey: "ShopValueId") as! String
self.navigationController?.pushViewController(detailVC, animated: true)
}
}
Here is the scenario:
I am within subCategoryVC I click on a collectionView cell, this instantiates the DetailVC. within the DetailVC I click on the seeAll button to load the images in the collection view ( this is done using SDWebImage using this method :
l
let imageStringURL = ShopDetailData.coverImage!
imgViewShop.sd_setShowActivityIndicatorView(true)
imgViewShop.sd_setIndicatorStyle(.gray)
imgViewShop.sd_setImage(with: NSURL(string:imageStringURL)! as URL, placeholderImage:UIImage(named:"noimage") , options: .refreshCached, completed: nil)
when I click on the btnBack(back button) and I pop the view controller using navigationContrller.popViewController() this is where the deinit message should be printed in the "print area" but this never happens.
furthermore when I open 2 or 3 detailVC's and push the seeAll button the app crashes and "print area" shows
"app terminated due to memory issue".
I just used Instruments to check for memory leak. there is one leak as it turns out and with these details :
leaked object = _swiftStringStorage<UInt16>
responsible library = libswiftCore.dylib
responsible frame = swift_slowAlloc
The Apps allows limited memory. I guess after 800mb , app is shut down with memory issue. This is not a true way that is downloaded 200 images for one controller but you can use with tableview with dequereuaseble and sdwebimage or kingfisher. Also you can use thumbnail images because you dont need to show 1 mb image in imageview , this is not unnecessary.
You probably have a retain-cycle. This means that some of the subviews of your ViewController has a strong reference to the ViewController itself or to another object that has the strong reference to the ViewController. When this happens, even if you pop the ViewController it won't be destroyed until the subview is destroyed, which will never be destroyed while the ViewController exists.
If this is your case, the solution would be searching for this circular reference in your subviews and put a "weak" in the variable that references the ViewController. Searching for places where you assign "self" to a variable or where you use "self" inside an enclosure could help.
This question already has answers here:
How to initialize properties that depend on each other
(4 answers)
Closed 5 years ago.
i have implemented assistolab dropdown in my project.but in some viewcontroller it could not work properly.it shows,
cannot use instance member within property initializer
my code snippet is given below
class MobileTopUpVC: UIViewController,UITextFieldDelegate {
let dropDown = DropDown() //error is here
#IBOutlet weak var mobileTopUpImag: UIImageView!
#IBOutlet weak var amountTxt: UITextField!
#IBOutlet weak var mobileNumberTxt: UITextField!
#IBOutlet weak var operatorTxt: UITextField!
#IBOutlet weak var countryTxt: UITextField!
#IBOutlet weak var DropDown: UIView!
#IBOutlet weak var backGroundView: UIView!
var textArray = [UITextField]()
var countryArray:[String] = colors.countryArray
var operatorArray:[String] = colors.opArray
#IBOutlet weak var proceedButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
backGroundView.layer.cornerRadius = backGroundView.frame.width/2
backGroundView.clipsToBounds = true
//countryArray = colors.countryArray
backGroundView.layer.borderWidth = 3
backGroundView.layer.borderColor = colors.second.cgColor
textArray = [countryTxt,operatorTxt,amountTxt,mobileNumberTxt]
let view1:UIView! = UIView()
view1.frame = CGRect(x: 0, y: 0, width: 0, height: 0)
countryTxt.inputView = view1
operatorTxt.inputView = view1
// countryTxt.layer.borderWidth = 1
// countryTxt.layer.borderColor = UIColor.green.cgColor
// countryTxt.borderStyle = UITextBorderStyle.bezel
borderStyle()
proceedButton.Cradius(size: 15.0)
mobileTopUpImag.image = mobileTopUpImag.image?.withRenderingMode(.alwaysTemplate)
mobileTopUpImag.tintColor = colors.second
countryDropDown()
}
the error is troubling me in this line
let dropDown = DropDown()
please help me to resolve this
Change your code to the following so your DropDown is initialised in the viewDidLoad
and also change your View name From "DropDown" to something else :D
class MobileTopUpVC: UIViewController,UITextFieldDelegate {
let dropDown: DropDown? //Changed**
#IBOutlet weak var mobileTopUpImag: UIImageView!
#IBOutlet weak var amountTxt: UITextField!
#IBOutlet weak var mobileNumberTxt: UITextField!
#IBOutlet weak var operatorTxt: UITextField!
#IBOutlet weak var countryTxt: UITextField!
#IBOutlet weak var dropDownView: UIView! // Change your VIEW NAME!!!
#IBOutlet weak var backGroundView: UIView!
var textArray = [UITextField]()
var countryArray:[String] = colors.countryArray
var operatorArray:[String] = colors.opArray
#IBOutlet weak var proceedButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
dropDown = DropDown()
backGroundView.layer.cornerRadius = backGroundView.frame.width/2
backGroundView.clipsToBounds = true
//countryArray = colors.countryArray
backGroundView.layer.borderWidth = 3
backGroundView.layer.borderColor = colors.second.cgColor
textArray = [countryTxt,operatorTxt,amountTxt,mobileNumberTxt]
let view1:UIView! = UIView()
view1.frame = CGRect(x: 0, y: 0, width: 0, height: 0)
countryTxt.inputView = view1
operatorTxt.inputView = view1
// countryTxt.layer.borderWidth = 1
// countryTxt.layer.borderColor = UIColor.green.cgColor
// countryTxt.borderStyle = UITextBorderStyle.bezel
borderStyle()
proceedButton.Cradius(size: 15.0)
mobileTopUpImag.image = mobileTopUpImag.image?.withRenderingMode(.alwaysTemplate)
mobileTopUpImag.tintColor = colors.second
countryDropDown()
}
You are using DropDown class as property name. Check below line in your code-
#IBOutlet weak var DropDown: UIView!
It should be something like this-
#IBOutlet weak var dropDownView: UIView!
activite1Label as the tag 1
class StatsViewController: UIViewController {
#IBOutlet weak var activite1Label: UILabel!
#IBOutlet weak var activite2Label: UILabel!
#IBOutlet weak var activite3Label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
activite1Label.text = activite[0]
activite2Label.text = activite[1]
activite3Label.text = activite[2]
miseAjourTotal()
}
func miseAjourTotal() {
let leLabel = view.viewWithTag(1) as! UILabel
print("leLabel: \(leLabel.text)")
}
}
Nothing in your code tells that the label has the tag 1. You should go to your storyboard and check if the label does have tag 1 or set the tag programmatically