«Программирование мышкой» в XCode 6 для Swift

    Привет, Хабрахабр!

    По причине недавно возникшей необходимости, пришлось писать под iOS, и я заметил сильную нехватку гайдов на русском языке даже для элементарных действий вроде «прицепить к нажатию кнопки какое-то действие», «считать данные из текстового окошка». Статья для начинающих разработчиков под iOS, прошу таких под кат.

    Итак, для начала для отработки примеров

    Cоздадим проект SingleView Application


    Если сами создавать умеете, то этот этап можно и пропустить
    1. Выбираем тип проекта
    2. Выбираем название
    3. Готово, можно приступать



    Дальше немного усложним наше приложение


    1. Поменяем класс контроллера нашего первого View на MainViewController
      Вот так
      До:

      После(меняем название класса и файла):

      До:

      После(CustomClass справа сверху меняем на новый)):

    2. Добавим второй View и ViewController для него(назовем его SpecialViewController)
      Вот так
      Наводим мышку на нужный на тип контроллера(ViewController), и перетаскиваем на вкладку интерфейса(Drag-n-Drop), затем создаем класс для нашего нового контроллера SpecialViewController(базовый код стандртен и аналогичен коду главного контроллера на этом этапе) в новом файле под названием SpecialViewController.swift. Затем выбираем наш контроллер в визуальном редакторе и в его свойствах в вкладке CustomClass в поле Class выбираем из списка наш свежесозданный класс контроллера.




    Итак, у нас теперь есть два окна, в одно из которых попасть у пользователя просто не получится.

    Перейдем к программированию мышкой



    1. Добавляем элементы в визуальный редактор

    Это самая простая часть, делается как и везде.
    Текстовому полю мы задали свойство Placeholder, оно позволяет выводить «приглашение для ввода», которое видно только пока не введено никакого текста. Но о свойствах не будем сильно распостраняться в рамках этой статьи, дабы не перегружать.


    2. Добавляем наши элементы в класс контроллера, для работы с ними напрямую

    Для начала надо выбрать значок наверху, он нужен нам чтобы одновременно видеть контроллер в визуальном редакторе и код класса этого же контроллера. Затем просто «перетаскиваем» нужный нам элемент контроллера правой кнопкой мыши в визуальной половине на его код. Вам предложат произвольное название переменной, по которой теперь доступен элемент для всех функций контроллера.


    3. Добавляем обработку событий элементов окна

    Для этого нужны небольшие приготовления. Сначала кликаете пкм по нужному элементу, получаете вот такое окно:

    Список событий здесь описывать не буду, они, имхо, самоочевидны. Выбираете нужное вам и левой кнопкой мыши перетаскиваете его в код.


    4. Небольшой пример

    Здесь мы по нажатию кнопки меняем текст Label на введенный пользователем. С демонстрацией работы на симуляторе под iPhone 6


    Как наиболее внимательные читатели могли уже заметить, наш редактор ругается на невозможность попасть в SpecialView. И он прав! Именно для решения этой проблемы через визуальный редактор существует такое понятие как Segue. Благодаря им мы можем наглядно показать, откуда куда может попасть пользователь.

    Переходы между окнами



    1. Простейший вариант

    Самый простой вариант — безусловный переход. Добавим для этого в наш проект кнопку «Перейти», нажмем над ней ПКМ и протащим появившуюся линию до того View, на который мы хотим получить переход(SpecialView в нашем случае). Получим запрос о типе Segue, выбираем там show — с остальным можете сами поэкспериментировать. Аналогично добавим в SpecialView кнопку назад, и прицепим к ней переход в MainView.

    Вот как это выглядит в запущенном приложении


    Как видите, простейшие переходы можно создавать не написав ни единой строчки кода. Но, естественно, далеко не всегда хватает безусловных переходов.

    2. Добавим условный переход

    Самый простой способ для этого — вызывать наш переход через код. Но ведь в коде его и нету. Да и по нажатию кнопки все равно срабатывать будет, а этого не хотелось бы. Выход довольно прост: удаляем старую версию перехода, а новую ведем не от нашей кнопки, а от желтого кружочка самого ViewController,  назовем наш переход MainToSpecial

    Итак, пусть мы хотим пускать пользователя в SpecialView только если поле для ввода и Label содержат одинаковый текст.
    Для этого нам надо создать для кнопки событие нажатия в контроллере, в нем проверять это условие. Если оно выполняется, выполним переход с помощью вот такого кода:
    self.performSegueWithIdentifier("MainToSpecial", sender: self)//вместо MainToSpecial название любого из созданных вами переходов
    

    Добавляется этот код вот так


    Проверяем…
    Все работает


    Как видите, пускает на SpecialView только при одинаковых значениях в полях, а вот обратно — в любом случае, что нам и нужно.
    На этом можно и закончить, но все-таки покажу напоследок асинхронную проверку условий перехода, т.к. имхо она не менее важна.

    3. Асинхронный переход с проверкой условия на сервере

    В общем-то отличий от синхронного варианта не слишком много:
    1. Проверка условия не происходит мгновенно и не может находиться в обработчике нажатия кнопки напрямую
    2. Надо как-то показывать пользователю, что он ждет
    3. Придется использовать коллбэки

    Во-первых, вся логика приложения не имеющая свзяи с интерфейсом, должна находиться в отдельных классах, поэтому создадим класс Server в файле Server.swift с единственной функцией(код, конечно, не очень, но не хочу усложнять пример):
    Скрытый текст
    
    import UIKit
    
    let server=Server()
    class Server {
        private let apiURL="http://worldteam-m.com/test.php?"
        func tryCheck(data:String,callback:(NSDictionary)->Void)
        {
            let request=(self.apiURL+data)
            let encoded = request.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
            var url: NSURL = NSURL( string: encoded!)!
            var session = NSURLSession.sharedSession()
            var task = session.dataTaskWithURL(url, completionHandler: {data, response, error -> Void in
                println("Task completed")
                if((error) != nil) {
                    println(error.localizedDescription)
                }
                var err: NSError?
                var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary
                if (err? != nil) {
                    println(error.localizedDescription)
                }
                dispatch_async(dispatch_get_main_queue(), {
                    callback(jsonResult)
                })
            })
            task.resume()
        }
    }
    
    


    Сервер не указан специально, т.к. хабраэффект. Так что эту часть приложения вы сможете затестить только со своим сервером, либо используя для тестирования чужой публичный webAPI. См. UPD
    В этом коде мы делаем запрос, и в случае получения ответа отправляем его в переданный нам из UI коллбэк.
    Код MainViewController поменяется на такой:
    Скрытый текст
        @IBAction func MtoS(sender: AnyObject) {
            server.tryCheck( WhereLbl.text! + FromText.text!, callback: onResponse)
        }
        
        func onResponse(json:NSDictionary) {
            if json["code"] as String == "ok" { //допустим, что если сервер считает переход корректным, он пошлет нам {"code":"ok"}
                self.performSegueWithIdentifier("MainToSpecial", sender: self)//все ок, делаем переход
            } else {
                self.WhereLbl.text="Forbidden!"//иначе сообщаем о неудаче
            }
        }
    


    И остается один неприятный, но важный момент — показать пользователю задержку. Для это есть специальный компонент UIActivityIndicatorView, причем мы сразу выставляем ему свойство HidesWhenStopped чтобы он был виден только при анимации, при начале асинхронного запроса мы его анимацию включаем, а при получении ответа в нашем коллбеке — выключаем.


    Много чего еще можно написать о программировании на Swift в XCode, но пока остановимся на этом.
    Надеюсь, что статья принесет пользу новичкам, а может и не только им(хе-хе).

    UPD Добавил сервер для теста асинхронной версии в код класса сервера, можете тестить )
    НУ или залить на свой хостинг вот такой файл PHP и поменять apiURL на ссылку к вашему файлу.
    <?php
    sleep(4);
    
    if(rand()%2==0)
    {
    	print json_encode(["code"=>"ok"]);
    } else 
    print json_encode(["code"=>"fail"]);
    
    return;
    ?>
    

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 27

      +1
      Немое кино?
        +1
        Могу и со звуком переписать. Но зачем? Все-таки все видео крайне короткие, по сути те же гифки.
          0
          Можно было бы сделать статью со скриншотами и отдельно вконце видео со звуком.
          Я на первых двух видео ползунок теребил в надежде на пояснения.
            +1
            Это скорее проблема плохого комментирования видео, поправлю.
            Ну и для UI сугубо на мой взгляд даже коротенькое видео иногда намного нагляднее серии скриншотов и словесных описаний.
        –3
        image
          +2
          Ваше изображение не загружается.
          Почему бы не воспользоваться habrastorage.org?
          0
          Спасибо, продолжайте, очень полезные и нужные туториалы!
            0
            Отлично!
            А на английском подобное для Swift есть? Что-то пытался читать какой-то tutorial, там все неплохо было расписано про код, но все действия, которые надо было сделать мышкой почему-то были пропущены.
              0
              А на английском подобное для Swift есть?

              В виде собранной статьи не нашел, собирал по крупицам. Может где-то и есть все это сразу и в наглядном виде, но найти не удалось.
              Могу это на английский перевести, если надо =)
            0
            Ваш бы гайд, да полмесяца назад — та же ситуация, понадобилось писать под ios, в результате тоже столкнулся с малым количеством гайдов. И все равно, большое спасибо, прочитал-поглядел, именно так все и сделал.
              +1
              Благодарю, за сглаживания порога вхождения. Это определенно полезная информация. Надеюсь будет продолжение.
                +3
                Ребят читайте книги, проходите курсы, в изучении чего-либо нужен системный подход. Подобные туториалы оставляют у новичков больше вопросов, чем ответов. Если и читать туториалы вырванные из контекста, то хотя бы по конкретной теме, где аккуратно расписывается подобробности, тут обо всем и ни о чем.
                Автору советую почитать про «ios autolayout», чтобы не приходилось складывать элементы в левый верхний угол ;) Замечаний достаточно, но в дискуссию ввязываться не хочу, потому озвучивать не буду.

                Выше просили инфы:
                Туториалы:
                www.raywenderlich.com/
                www.shinobicontrols.com/iOS8DayByDay (кстати можно найти и по iOS 7)
                www.appcoda.com/
                nsscreencast.com/ — платные по сути
                iosdevelopertips.com/ — скорее набор ссылок на чужие статьи
                Advanced:
                nshipster.com/
                И даже журналы:
                iosdevweekly.com/ — еженедельный дайджест
                www.objc.io/ — ежемесячный (advanced)
                Библиотеки:
                maniacdev.com/
                Просто бложики:
                oleb.net/blog/
                petersteinberger.com/
                www.thinkandbuild.it/
                ashfurrow.com/

                Всем iOS-разработки!
                  0
                  А аналогичного на русском языке в природе существует? Английский конечно проблем не вызывает, но на русском читать все таки полегче.
                  Хотя судя по тому что я вижу, русскоязычных материалов по iOS-разработке очень немного (актуальных тем более).
                    0
                    Года три назад читал несколько сайтов на русском, потом где-то перестали писать, а где-то понял, что качество статей низкое, и там учат плохому. Сейчас нашел только один из тех, но он мертвый.
                      0
                      Спасибо, я так и понял.
                      Насчет нужности — ну например у меня ситуация была такая, что «нужно iOS приложение как можно скорее, хотя бы прототип». Поэтому у меня увы не было времени основательно засесть за изучение основ, приходилось все в процессе изучать, так как надо было показать прототип хотя бы в течении месяца, и это при помимо основного профиля работы — разработки внутренних веб-сервисов компании. Поэтому сейчас стараюсь уже основательно и систематично изучать основы, когда темп немного спал.
                  0
                  А зачем, начиная программировать под iOS, вы начинаете пытаться писать сразу на Swift? Тем самым создавая себе проблемы.
                    +2
                    Затем, что порог вхождения у него сильно ниже чем у Objective C. И я бы не сказал, что он создает так уж много проблем. Плюсом идет возможность использовать стратегии из многих других знакомых мне языков, что на Obj. C делать затруднительно.

                    Ну и очевидно, что со временем появится большой спрос на Swift программистов, и не хочется упустить момент :)
                    0
                    Статья отличная, для новичков в ios, на вроде меня — самое то, отдельный респект за видеовставки, коротко и со вкусом, но о главном :)
                    Сам пока что изучаю Swift по эпловскому букварю: «The SWIFT programming language», все никак не дождусь когда мой макбук приедет, чтобы начать вживую это все щупать :)
                      +1
                      я с вируталки сижу, в принципе жить можно =)
                      правда тут как с железом повезет — и на посленей версии оси(Yosemite) сильно тормозить стало, так что лучше ставьте 10.9 если надумаете))
                        0
                        В смысле виртуалки с винды?
                        У меня в принципе iMac27 стоит, но жена не пускает за машину (бо либо эта машина её, либо ешь пельмени :), поэтому жду своего родного девайса.
                          0
                          угу. ноут игровой правда. могу даже образ скинуть. житиё студентом не позволяет вот так взять и купить себе мак бук/мак, хотя планы такие есть :)
                            0
                            Ясно, нет я лучше подожду до живого железа, темболее книжку еще не до конца освоил.
                            А вот статьи — если чесно, я бы был только благодарен, если бы они еще были такого плана.
                            Пиши еще — чесно.
                            Мы всем IT отделом читали и смотрели ролики — действительно, все очень просто получается, если так подавать материал.
                              0
                              Я тоже долго сидел под виртуалками, как повод изучить OS X, после чего таки тоже купил себе макбук — реальное железо и виртуалка очень отличается таки.
                              А вот перспективы swift'a для меня не ясны — если кто более грамотный в среде мобильной разработки сможет написать какую-то аналитику про него — это будет очень здорово.
                                0
                                аналитика аналитикой, но пока опыт использования в разработке заставляет отказываться от него, причем из-за багов xode в основном.
                      0
                      MaximChistov, спасибо огромное за такие примеры! Благодаря им начал немного осваивать xcode/swift. Это супер! Надеюсь будут ещё примеры!
                        0
                        Спасибо за материалы. Но это адова жесть, чтобы просто создать обработчик для кнопки столько всего надо сделать.

                        Only users with full accounts can post comments. Log in, please.