Fuwafuwa's memorandum

Fuwafuwa's memorandum

Data analysis, development, reading, daily feeling.
MENU

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Swift: ToDoListの作成

ネット上に上がっているものがどれも少しづつ動かなかったので修正しました。

storyBoardでtableViewをViewControllerにドラッグ&ドロップ。
Cntlボタンを押しながらtableViewをstoryBoard上左端のアイコンにドロップ。
OutletsでdelegateとDataSourceを設定。
TableViewCellのIdentifierをcellに設定。
TableViewのPrototype Cellsを1に設定。

TableViewをCtrlボタンを押しながらViewController.swiftにドロップ。
Outletを作成。
名前は任意ですがここではtodolistTableとします。

storyBoardでNavigationBarをドロップ。
titleは任意ですがToDoListなどにしてください。

BarButtonItemをドロップ。
SystemItemをAddに変更。

addItem.swiftなどの名前で新しいswiftファイルを作成する。
新しいViewControllerをStoryBoardにドロップ。
Custom ClassのClassをaddItemとして上記ファイルと紐づける。

ViewController.swift内に設置したaddボタンをCtrlを押しながらaddItemにドラッグ&ドロップ。
segueからshowを選択する。
これでaddボタンからaddItemに画面遷移できます。

addItemにTextFieldをドラッグ&ドロップ
Ctrlボタンを押しながらswiftファイルのclass内にドラッグ&ドロップし、Outletを作成。
ここでは名前はitemTextとする。

buttonをaddItemにドラッグ&ドロップ。
Ctrlを押しながらaddItem.swiftのclass内にドラッグ&ドロップでActionを作成。
ここでは名前はAddItemとする。

ViewController.swiftに下記記載。

import UIKit

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet weak var todolistTable: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()
        todolistTable.delegate = self
        todolistTable.dataSource = self
        // Do any additional setup after loading the view, typically from a nib.
        if NSUserDefaults.standardUserDefaults().objectForKey("todoList") != nil {
            todoItem = NSUserDefaults.standardUserDefaults().objectForKey("todoList") as! [String]
        }
    }

    
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return todoItem.count
    }
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell")
        
        cell.textLabel?.text = todoItem[indexPath.row]
        return cell
    }
    
    func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath){
        if editingStyle == UITableViewCellEditingStyle.Delete{
            todoItem.removeAtIndex(indexPath.row)
            NSUserDefaults.standardUserDefaults().setObject(todoItem, forKey: "todoList")
            todolistTable.reloadData()
        }
    }
    
    override func viewDidAppear(animated: Bool) {
        todolistTable.reloadData()
    }
    
    func tableView(table: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        print(todoItem[indexPath.row])
    }
    
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    @IBAction func TitleView(segue: UIStoryboardSegue) {
    }
}
addItem.swiftに下記記載。
import UIKit

var todoItem = [String]()

class AddToDo: UIViewController {
    @IBOutlet weak var itemText: UITextField!
    @IBAction func addItem(sender: AnyObject) {
        todoItem.append(itemText.text!)
        itemText.text = ""
        NSUserDefaults.standardUserDefaults().setObject(todoItem, forKey: "todoList")
        print(todoItem)
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    override func touchesBegan(touches: Set, withEvent event: UIEvent?) {
        self.view.endEditing(true)
    }
    
    func textFieldShouldReturn(textField: UITextField!) -> Bool {
        itemText.resignFirstResponder()
        return true
    }
}
ほぼ完成ですが最後にaddItemのbarbuttonitemからTitle画面に戻る処理を付け加えます。

addItemにNavigationBarをドラッグ&ドロップ。

BarButtonItemをドラッグ&ドロップ。
BarButtonItemをCtrlボタンを押しながらControllView上部右端のExitにドラッグ。
ViewController.swiftに記載したTitleViewを選択。

スポンサーサイト

Swift: WatchConnectivityでAppWatchとiPhoneのデータ連携

AppWatchとiPhoneのデータの連携をWarchConnectivityで行います。
watchOS2からはAppGroupsは使用できなくなっているみたいです。

ここではwatchにおけるデータをiPhoneで受け取りデバッグ画面に値を出力する。

File/New/Projectで新規プロジェクトの作成。
File/New/Target..でiOSじゃらwatchOS、Applicationを選択し、WatchKitAppを選択、Next。
↓AppDelegate.swiftに下記記載。

import WatchConnectivity

class AppDelegate: UIResponder, UIApplicationDelegate, WCSessionDelegate { //WCSessionDelegateを追記
    var window: UIWindow?
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        if WCSession.isSupported(){
            let session = WCSession.defaultSession()
            session.delegate = self
            session.activateSession()
        }
        return true
    }
}
↓ExtensionDelegate.swiftに下記記載。
import WatchConnectivity

class ExtensionDelegate: NSObject, WKExtensionDelegate,  WCSessionDelegate {//WCSessionDelegateを追記

    func applicationDidFinishLaunching() {
        // Perform any final initialization of your application.
        if WCSession.isSupported(){
            let session = WCSession.defaultSession()
            session.delegate = self
            session.activateSession()
        }
    }
}
↓InterfaceController.swiftに下記記載。
import WatchKit
import Foundation
import WatchConnectivity

class InterfaceController: WKInterfaceController,  WCSessionDelegate {

    override func awakeWithContext(context: AnyObject?) {
        super.awakeWithContext(context)
        let applicationDict = [ "Hallow": "World" ];
        
        do {
            try WCSession.defaultSession().updateApplicationContext( applicationDict )
        } catch {
            print( "Send Error" );
        }
    }
}
↓ViewController.swiftにのclass ViewController内に下記を記載。
    func session( session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject] ) {
        let hallow = applicationContext["Hallow"] as! String
        
        dispatch_async( dispatch_get_main_queue() ) {
            print( hallow) // printed "World"
        }
    }
}
watchとiPhoneをそれぞれ起動してください。 デバッグ画面にWorldと出力されます。

Swift: AdMobで広告配信

AdMob登録。
管理画面、収益化タブからアプリを選択し、バナーの種類などを登録、高校ユニットIDを取得。
この広告ユニットIDを下述コード内のAdMobIDとする。

新しい AdMob 管理画面では
広告ユニット ID は ca-app-pub-XXXXXXXXXXXXXXXX/NNNNNNNNNN の形式になる。
pub-XXXXXXXXXXXXXXXX の形式を使用していると下記のエラーが。
「Invalid unknown request error: Cannot determine request type. Is your ad unit id correct?」

下記ページより最新版をダウンロード。
https://firebase.google.com/docs/admob/ios/download?hl=ja
GoogleMobileAds.frameworkをプロジェクトファイルに入れる。

x-code画面のプロジェクト名→TARGETS→プロジェクト名→Build Phases
Link Binary With Librariesに下記のフレームワークを追加する。

CoreMedia.framework
AdSupport.framework
GoogleMobileAds.framework(上記で手動でプロジェクトに追加したフレームワーク)
AudioToolbox.framework
AVFoundation.framework
CoreGraphics.framework
EventKit.framework
EventKitUI.framework
MessageUI.framework
StoreKit.framework
SystemConfiguration.framework
CoreTelephony.framework
MediaPlayer.framework

ViewControllerに下記を記載。
AdMobTestとSimulaterTestはテスト時にはtrue。
アプリをストアに配信する際にはfalseに書き換える。

import UIKit
import SpriteKit
import GoogleMobileAds

class GameViewController: UIViewController, GADBannerViewDelegate {

    let AdMobID = "ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXX"
    let TEST_DEVICE_ID = "XXXXXXXXXXXXXXXXXXXXXX"
    let AdMobTest:Bool = false
    let SimulaterTest:Bool = false
    override func viewDidLoad() {
        super.viewDidLoad()
        
        if let scene = TitleScene(fileNamed:"GameScene") {
            let skView = self.view as! SKView
            skView.ignoresSiblingOrder = true
            scene.scaleMode = .AspectFill
            scene.size = skView.frame.size
            skView.presentScene(scene)
            self.banner_ads()
        }
    }
    
    func banner_ads(){
        var admobView: GADBannerView = GADBannerView()
        admobView = GADBannerView(adSize:kGADAdSizeBanner)
        admobView.frame.origin = CGPointMake(0, self.view.frame.size.height - admobView.frame.height)
        admobView.frame.size = CGSizeMake(self.view.frame.width, admobView.frame.height)
        admobView.adUnitID = AdMobID
        admobView.delegate = self
        admobView.rootViewController = self
        
        let admobRequest:GADRequest = GADRequest()
        
        if AdMobTest {
            if SimulaterTest {
                admobRequest.testDevices = [kGADSimulatorID]
            }
            else {
                admobRequest.testDevices = [TEST_DEVICE_ID]
            }
        }
        admobView.loadRequest(admobRequest)
        self.view.addSubview(admobView)
    }
}

Swift: Unwind Segueを用いた画面遷移

storyboard上のExitを用いた画面遷移です。
いわゆる「戻る」ボタン。
重ねられたViewControllerを除去するだけでなく任意の画面へ戻れます。
遷移先のViewControllerファイルのクラス内に下記を追記。

@IBAction func backView(segue: UIStoryboardSegue) {
}
storyboardで遷移前のViewControllerにbuttonを設置。
クリックでCtrlを推したまま上部右側のExitにドラッグ、ドロップ。
先ほど遷移先のViewControllerのファイルで指定したfunc名(ここではbackView)を選択。
これだけ。
実行してbuttonをタップすると任意の画面に遷移します。

Swift: storyboardを用いたモーダルのセグエの設定

確認するのがめんどっちいので記憶に頼ったメモ。
左側のゲーナビゲータエリアの任意のディレクトリで右クリック、新しいファイルの作成、
Cocoa Touch Classを選択、subclassをUIViewControllerに設定、名前をつけて保存。

storyboardで新たなViewControllerを設置する。
右側アイデンティティインスペクタの
Custom ClassのClass欄に新しく作ったファイルの名前を指定。
(これでファイルとstoryboardのViewControllerが紐づけられる。

遷移前のViewControllerにbuttonを設置。
(このbuttonから画面を遷移するとする)

buttonをクリック、Ctrlを推したまま遷移後のViewControllerにカーソルをドラッグ、ドロップ。
表示されたActionSequeからshowを選択。

これだけ。
実行しbuttonをクリックすると画面が遷移します。

storyboardのセグエ(ViewControllerをつなぐもの)をクリック、
アトリビュートインスペクタのTransitionから遷移時のアクションも変更できます。

この方法だとモーダル(画面を重ねて表示)となるので
前の画面に戻る時などは別に画面を取り除く形で遷移させる。

該当の記事は見つかりませんでした。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。