Много лет хотел начать программировать под OSX. Я люблю эту ОС за ее красивый UI, за его плавность. Открывая Xcode так и хочется чего-нибудь напрограммировать. Читал много туториалов как начать программировать на Objective-C, но как только начинал пробовать выполнять примеры натыкался на «соединение» интерфейса с кодом. Для меня, привыкшего к VS, это просто другой подход. Мне до сих пор непонятно почему нельзя сделать так: перетащил кнопку с палитры компонентов, два раза кликнул, обработчик готов, начинай. Тут нет. Видимо это так и останется для меня загадкой. Ну да ладно. Начнем.
Создадим приложение калькулятор. Это чуть сложнее чем классический «Hello World!», но и интереснее. В проекте будет несколько кнопок и текстовая метка. Будут рассмотрены важные для начинающих моменты, такие как: как обратиться к элементу на форме; как записать значение из элемента формы в переменную; создание обработчиков кнопок; «связывание» элементов на форме с кодом.
Создаем новый проект для OS X, выбираем Cocoa Application
На следующем шаге задаем имя проекта. Выбираем язык Swift. Core Data здесь не нужны.
Проект готов. Мы попадаем в окно со свойствами проекта.
В свойствах ничего не изменяем. Переходим сразу к созданию пользовательского интерфейса.
Перетащим на форму Label и несколько кнопок. Расположим их, например как на рисунке.
Переходим к самому интересному, связыванию элементов формы и кода. Для этого придумали Assistant editor. Выполняем View->Assistant Editor->Show Assistant editor. Окно свойств элементов формы можно закрыть. Для этого выполним View->Utilities->Hide Utilities.
В окне с кодом файла ViewController.swift удалим лишний созданый средой Xcode код и приведем код к такому виду.
//
// ViewController.swift
// calc
//
// Created by user on 26.03.15.
// Copyright (c) 2015 user. All rights reserved.
//
import Cocoa
class ViewController: NSViewController {
}
Зажмем клавишу control и нажмем левой кнопкой мыши на label и перетащим курсов в область кода внутрь класса ViewController.
Отпустим все кнопки и появится окно со свойствами соединения. Необходимо выбрать outlet. Т.к. метка не нуждается в действии и задать имя.
В результате код приобрете следующий вид.
import Cocoa
class ViewController: NSViewController {
@IBOutlet weak var display: NSTextField!
}
Добавиться строка
@IBOutlet weak var display: NSTextField!
Точно так же поступим и с кнопками. Выделим их все. Зажмем control и перетащим в окно кода. Создадим Action. Зададим имя и выберем отправителя NSButton.
Код будет выглядеть следующим образом.
import Cocoa
class ViewController: NSViewController {
@IBOutlet weak var display: NSTextField!
@IBAction func addDigit(sender: NSButton) {
}
}
Action добавлен в виде функции addDigit. Это и есть обработчик нажатия кнопки. В данном случае это Action. Нет необходимости создавать отдельные обработчики для каждой кнопки, т.к. в функцию передается объект, ее вызвавший.
sender: NSButton
У него можно посмотреть свойства и получить какая это цифра. Для действий (умножение, сложение…) создадим отдельные Action. Можно и не создавать, но я решил создать. В результате код будет ViewController.swift будет выглядеть следующим образом.
//
// ViewController.swift
// calc
//
// Created by user on 26.03.15.
// Copyright (c) 2015 user. All rights reserved.
//
import Cocoa
class ViewController: NSViewController {
//атутлет для NSTextFiled
//далле обращаемся к нему по имени display
@IBOutlet weak var display: NSTextField!
//переменная хранит, начали ли печатать
var notstarttyping : Bool = false
//action для цифр
@IBAction func addnumber(sender: NSButton) {
//константа для цифры
//берем ее из свойства title вызвавшей этот action кнопки
let digit = sender.title
//если начали печатать
if (notstarttyping == false) {
//сотрем 0 и присвоим цифру
display.stringValue = digit
notstarttyping = true
} else {
//добавим к существующему значению цифру
display.stringValue = display.stringValue + digit
}
}
//первая часть выражения
var firstval : Float = 0
//вторая часть выражения
var secondval : Float = 0
//результат
var resultat : Float = 0
//что это за действие
var act : NSString = "0"
//обработка сложения
@IBAction func plusact(sender: NSButton) {
//присвоим первой части то что написано в display
//конвертируем NSString во float
firstval = (display.stringValue as NSString).floatValue
//покажем, что это сложение
act = "+"
//очистим display
display.stringValue = ""
}
//обработка вычитания
@IBAction func minusact(sender: NSButton) {
//присвоим первой части то что написано в display
//конвертируем NSString во float
firstval = (display.stringValue as NSString).floatValue
//покажем, что это вычитание
act = "-"
//очистим display
display.stringValue = ""
}
//обработка умножения
@IBAction func umnact(sender: NSButton) {
//присвоим первой части то что написано в display
//конвертируем NSString во float
firstval = (display.stringValue as NSString).floatValue
//покажем, что это умножение
act = "*"
//очистим display
display.stringValue = ""
}
//обработка деления
@IBAction func delit(sender: NSButton) {
//присвоим первой части то что написано в display
//конвертируем NSString во float
firstval = (display.stringValue as NSString).floatValue
//покажем, что это деление
act = "/"
//очистим display
display.stringValue = ""
}
//очистка, обработка C
@IBAction func clearact(sender: NSButton) {
//обнулим все переменные
firstval = 0
secondval = 0
act = ""
//очистим display
display.stringValue = ""
}
//обработка "равно"
@IBAction func ravnoact(sender: NSButton) {
//присваиваем второй части выражения, то что написано в display
secondval = (display.stringValue as NSString).floatValue
//смотрим какое это действие и выполняем его
//результат записываем в переменную resultat
if (act == "+") {
resultat = firstval + secondval
}
if (act == "-") {
resultat = firstval - secondval
}
if (act == "*") {
resultat = firstval * secondval
}
if (act == "/") {
resultat = firstval / secondval
}
//присваиваем значение переменной resultat метке
display.floatValue = resultat
}
}