swift simple view app - ios

class ViewController: UIViewController
{
#IBOutlet weak var simpleTextField: UITextField!
#IBOutlet weak var simpleLabel: UILabel!
#IBAction func changeLabel(sender: AnyObject)
{
simpleLabel.text = "salam, " + simpleTextField.text + "!";
}
}
I am a new swift learner and I'm trying to launch a simple app. I drag a label to storyboard. At first when I run the app it shows signal SIGABRT error. I cant solve the problem and I rewrite the code then when I try to run the app I have a problem. and when I run the app it show error breakpoint 1.5 its about
how can fix it?
thank you!

I have experienced that before.
Check #IBOutlet and #IBAction in storyboard.
Watch out for following point
・Not double connection.
・Not forget to delete connection that is not used.
That's all.

Check if all IBOutlet and IBAction are connected to their respective code.And also change the your IBAction code to this following
#IBAction func changeLabel(sender: AnyObject) {
simpleLabel.text = "salam \(simpleTextField.text) !"
}

Related

Setting a label to a value in Swift on XCode?

I understand it’s rather basic, but I’m only trying to get a grasp on basic functions.
I have produced some code by partially my own knowledge and partial bits from different guides.
I am not getting any errors, but the label is not displaying itself as “Text”. I believe it’s to do with the order/place my code is put.
Please help explain how I can fix this!
Please note as well:
I have just a single label called myLabel (named under the document section of my the identity inspector
It is has the text “Loaded” put into it already when I put it in.
I have no other code anywhere, only the default new project code.
I renamed the ViewController to ViewManager to avoid a class error.
First image: This is the image just so you know the location and other bits. I’ll attach the code too:
Second image: What I get, with no errors:
Third image: My main storyboard file:
And now it in code:
import UIKit
class ViewController: UIViewController {
#IBOutlet weak var myLabel: UILabel!
#IBAction func labelSet() {
myLabel.text = "Text"
}
}
Make sure that the IBAction is connected to Touch Up Inside in Interface Builder.
Change the signature of the IBAction to
#IBAction func labelSet(_ sender: UIButton) {
Your function func labelSet() isn't called anywhere. Neither in the Storyboard nor elsewhere.
You can call it in viewDidLoad() like this:
override func viewDidLoad() {
super.viewDidLoad()
labelSet()
}
Alternatively call it after the label has loaded.
#IBOutlet weak var myLabel: UILabel! {
didSet {
labelSet()
}
}

UIView to UIViewController communication via protocol not working

maybe I am missing something really fundamental here, but after staring at the code for an hour or so, my brain is going trough cycles and I would appreciate a fresh glance at this problem.
I have the following UIView:
import UIKit
protocol DetailViewWillShowUpDelegate {
func sendDetailOpened(_ openedBool: Bool)
}
class locationXIBController: UIView {
#IBOutlet weak var loationLabel: UILabel!
#IBOutlet weak var vsedniOteviraciDobaLabel: UILabel!
#IBOutlet weak var prijmajiKartyLabel: UILabel!
#IBOutlet weak var detailViewButtonOutlet: UIButton!
#IBOutlet weak var backgroundViewButton: UIButton!
let openedBool = true
var detailViewWillShowUpDelegate: DetailViewWillShowUpDelegate?
override func awakeFromNib() {
super.awakeFromNib()
}
#IBAction func vecerkaDetailButtonPressed(_ sender: UIButton) {
detailViewWillShowUpDelegate?.sendDetailOpened(openedBool)
print("pressed")
}
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
if let result = detailViewButtonOutlet.hitTest(convert(point, to: detailViewButtonOutlet), with: event) {
return result
}
return backgroundViewButton.hitTest(convert(point, to: backgroundViewButton), with: event)
}
}
Now the problem is, that when I call/press the vecerkaDetailButtonPressed function I get "pressed" output in the console but the protocol for some reason doesn't go trough.
The other side looks like this (stripped for simplicity):
class MapViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {
let locationXIB = locationXIBController()
let isVecerkaDetailOpened = false
override func viewDidLoad() {
locationXIB.detailViewWillShowUpDelegate = self
}
extension MapViewController: DetailViewWillShowUpDelegate {
func sendDetailOpened(_ openedBool: Bool) {
isVecerkaDetailOpened = openedBool
print("success")
}
}
I know the protocol value at the moment of execution is nil. As I said, any help is appreciated, thanks!
First, a couple of naming convention issues:
The name locationXIBController is a bad choice for a UIView object. It is a view object, not a controller object.
Second, class names in Swift should start with an upper-case letter. So LocationXIBView would be a much better name for that view class.
Next, your code
let locationXIB = locationXIBController()
...is wrong. That creates a brand-new instance of your locationXIBController class that you never install in your view hierarchy. You should make that line an IBOutlet:
#IBOutlet weak var locationXIB: locationXIBController!
And then you should control-drag from the locationXIBController in your StoryBoard onto the outlet in your view controller. That will cause Interface Builder to connect the outlet.
Now when you run your program the variable locationXIB will be connected to the locationXIBController view from your storyboard/XIB when it's loaded.
In addition to the answer of #Duncan C, you might check whether you need super.viewDidLoad() at the top of the viewDidLoad() method in the MapViewController class? Not doing that can lead to quirky things in your app.
I asked:
So does detailViewWillShowUpDelegate actually point at anything, or is it nil?
And you replied:
I just tried debugging and it is actually nil
So that's the problem... you need to set detailViewWillShowUpDelegate to point to a valid delegate object. This is often done in the .xib file or storyboard, and sometimes people forget to make that connection, so check there if it makes sense. Else you'll just need to get a reference to the delegate at some point before the code in question can run and set it up.
Answer to the credit of #Paulw11
I finally managed to get it working by communicating like so:
step 1) 1:1 communication via protocol between MKAnnotation and MKAnnotationView
step 2) 1:1 communication via protocol between MKAnnotationView and MapViewController passing the same data
Finally works like a charm, thanks!

Swift how to use container view and segmented control

I get a problem in using container view and segmented control to achieve switch views.I have put two container views in one view controller, and each of container view embed a new view(three view controller in the same UIViewController).
Here is my code
import UIKit
import Charts
class ReportViewController: UIViewController {
#IBOutlet weak var containerTwoWeeks: UIView!
#IBOutlet weak var containerToday: UIView!
#IBOutlet weak var segUi: UISegmentedControl!
#IBOutlet weak var resultLabel: UILabel!
#IBOutlet weak var paymentPie: PieChartView!
#IBOutlet weak var incomePie: PieChartView!
override func viewDidLoad() {
super.viewDidLoad()
// pieChartUpdate()
// selectResultData()
}
#IBAction func segChange(_ sender: UISegmentedControl) {
switch segUi.selectedSegmentIndex {
case 0:
self.containerTwoWeeks.isHidden = false
self.containerToday.isHidden = true
break
case 1:
self.containerTwoWeeks.isHidden = true
self.containerToday.isHidden = false
break
default:
break
}
}
func selectResultData() {
resultLabel.attributedText = reportService.selectResultData()
}
func pieChartUpdate () {
(too much code here, ignore it)
}
}
Everything works well until I called the method pieChartUpdate() or selectResultData() in vieDidLoad(),the error message as below
"Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value"
I can switch the views without calling the pieChartUpdate() or selectResultData() method, so I really want to know the reason and solution.Hope someone could figure out this problem,thanks.
You got very common mistake and error. But don't worry.
Check your full error message. There must be a clue what variable you are trying to access and getting nil (it might be resultLabel).
Then make sure the connection between storyboard and view controller for this variable is correct. You can try to remove and create it again if you don't get what is wrong.
If you need more help, please show us full error message.

Using a slider in WatchKit

I want the user to be able to select a range of years on a WatchKit App, since there's no UIPicker in WatchKit, can I use a slider to make the user click + or - to increment the year, to be displayed on my label above? I read the documentation but still can't figure out how to implement the setNumberOfSteps method....alternatively, is there a better way to do this than a slider?
class InterfaceController: WKInterfaceController {
#IBOutlet weak var label: WKInterfaceLabel!
#IBOutlet weak var sliderOutlet: WKInterfaceSlider!
#IBAction func slider(value: Float) {
func setNumberOfSteps(numberOfSteps: Int){
label.setText("\(numberOfSteps)")
}
}
You can definitely do this with a slider. To me there isn't probably a better alternative. You could also present a table view modally with all the possible years you want to be able to select from, but I think the slider is probably a better option if you don't have too many years to pick from. Here's a quick example of connecting a WKInterfaceSlider with a WKInterfaceLabel.
Storyboard
Add a WKInterfaceSlider and WKInterfaceLabel to your interface controller
Add the slider and label IBOutlets
Add a sliderValueChanged IBAction to your InterfaceController class
Set the properties to match the screenshots
Code
import WatchKit
class InterfaceController: WKInterfaceController {
// MARK: - Properties
#IBOutlet weak var label: WKInterfaceLabel!
#IBOutlet weak var slider: WKInterfaceSlider!
// MARK: - Interface Callback Methods
#IBAction func sliderValueChanged(value: Float) {
let roundedValue = Int(round(value))
self.label.setText("\(roundedValue)")
}
}
Hopefully that helps shed some light.

SWIFT signal SIGABRT error thread1

I am trying to code a simple app where you input 2 numbers in textfields and return the sum of them in iOS app. The problem is that I am getting Thread 1 signal SIGABRT error and I can't seem to find any fix for this.
This is the code:
#IBOutlet var result: UILabel!
#IBOutlet var firstnum: UITextField!
#IBOutlet var secondnum: UITextField!
#IBAction func add (sender: UIButton) {
var a = firstnum.text.toInt();
var b = secondnum.text.toInt();
var c = a!+b!;
result.text = "\(c)";
}
You should check your connections; if you have a label, textfield, etc connected from the main storyboard to the view controller, check to see if your label in Main.storyboard is linked to it by opening the right side panel and selecting the last bar. It will show you all the outlets that label has.
This occurs when you make a connection from the Main.storyboard to the ViewController.swift, and you remove the text in the ViewController.swift, but you do not remove the connection.
For more information, watch this video:
iOS Programming: How to fix thread 1 signal sigabrt in xcode 6
I hope this helps.

Resources